openpond-sdk 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TASKSETS.md +55 -0
- package/dist/actions-local.js +67 -118
- package/dist/actions-local.js.map +4 -4
- package/dist/actions.js +4 -92
- package/dist/actions.js.map +4 -4
- package/dist/chunk-27ETSPHQ.js +83 -0
- package/dist/chunk-27ETSPHQ.js.map +7 -0
- package/dist/chunk-5PRP457R.js +477 -0
- package/dist/chunk-5PRP457R.js.map +7 -0
- package/dist/chunk-65D4C7HP.js +273 -0
- package/dist/chunk-65D4C7HP.js.map +7 -0
- package/dist/chunk-747CMU2Y.js +222 -0
- package/dist/chunk-747CMU2Y.js.map +7 -0
- package/dist/chunk-7O5X7DBU.js +80 -0
- package/dist/chunk-7O5X7DBU.js.map +7 -0
- package/dist/chunk-A4ZDOZKP.js +115 -0
- package/dist/chunk-A4ZDOZKP.js.map +7 -0
- package/dist/chunk-APHPXQEA.js +155 -0
- package/dist/chunk-APHPXQEA.js.map +7 -0
- package/dist/chunk-AVW35YOH.js +574 -0
- package/dist/chunk-AVW35YOH.js.map +7 -0
- package/dist/chunk-AZUCY3E5.js +2395 -0
- package/dist/chunk-AZUCY3E5.js.map +7 -0
- package/dist/chunk-IVEXCIHO.js +1373 -0
- package/dist/chunk-IVEXCIHO.js.map +7 -0
- package/dist/chunk-K5ZCYOZO.js +49 -0
- package/dist/chunk-K5ZCYOZO.js.map +7 -0
- package/dist/chunk-LLHE4BOD.js +220 -0
- package/dist/chunk-LLHE4BOD.js.map +7 -0
- package/dist/chunk-LXXQVGQY.js +1 -0
- package/dist/chunk-LXXQVGQY.js.map +7 -0
- package/dist/chunk-P27DQ65Z.js +138 -0
- package/dist/chunk-P27DQ65Z.js.map +7 -0
- package/dist/chunk-QLEJOCQX.js +72 -0
- package/dist/chunk-QLEJOCQX.js.map +7 -0
- package/dist/chunk-S7I45WJQ.js +57 -0
- package/dist/chunk-S7I45WJQ.js.map +7 -0
- package/dist/chunk-ZPCK222K.js +586 -0
- package/dist/chunk-ZPCK222K.js.map +7 -0
- package/dist/index.js +33 -2488
- package/dist/index.js.map +4 -4
- package/dist/learning.js +16 -2042
- package/dist/learning.js.map +4 -4
- package/dist/model-batch-review.js +5 -42
- package/dist/model-batch-review.js.map +3 -3
- package/dist/model-projects.js +29 -430
- package/dist/model-projects.js.map +3 -3
- package/dist/model-starter-attempts.js +53 -310
- package/dist/model-starter-attempts.js.map +4 -4
- package/dist/model-starter-catalog.js +17 -460
- package/dist/model-starter-catalog.js.map +4 -4
- package/dist/model-starters.js +32 -709
- package/dist/model-starters.js.map +4 -4
- package/dist/model-taskset-authoring.js +11 -44
- package/dist/model-taskset-authoring.js.map +3 -3
- package/dist/profile-actions.js +4 -211
- package/dist/profile-actions.js.map +3 -3
- package/dist/project-actions.js +4 -224
- package/dist/project-actions.js.map +3 -3
- package/dist/refiner.js +14 -554
- package/dist/refiner.js.map +4 -4
- package/dist/taskset-catalog.js +9 -104
- package/dist/taskset-catalog.js.map +3 -3
- package/dist/taskset-drafts.js +465 -0
- package/dist/taskset-drafts.js.map +7 -0
- package/dist/taskset-packages.js +946 -3089
- package/dist/taskset-packages.js.map +4 -4
- package/dist/training.js +43 -822
- package/dist/training.js.map +4 -4
- package/dist/types/packages/sdk/src/index.d.ts +3 -3
- package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-client.d.ts +130 -0
- package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/learning.d.ts +1 -129
- package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +1170 -0
- package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +560 -0
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts +92 -0
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts +15 -0
- package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts +18 -0
- package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +1681 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts +19 -0
- package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2713 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +1000 -0
- package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +429 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +284 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +846 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-files.d.ts +8 -0
- package/dist/types/packages/sdk/src/taskset-draft-files.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts +28 -0
- package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts +8 -0
- package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +967 -0
- package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts +10 -0
- package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +1297 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +1597 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-drafts.d.ts +16 -0
- package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +64 -0
- package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1514 -0
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-packages.d.ts +6 -0
- package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
- package/dist/workflows.js +4 -221
- package/dist/workflows.js.map +3 -3
- package/package.json +5 -1
package/dist/training.js
CHANGED
|
@@ -1,826 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// src/model-projects.ts
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
import { assertBoundedTaskJson } from "@openpond/evals/task-schema";
|
|
7
|
-
|
|
8
|
-
// src/protocol.ts
|
|
9
|
-
var OPENPOND_TRAINING_PROTOCOL_MAJOR = 2;
|
|
10
|
-
var OPENPOND_TRAINING_MEDIA_TYPE = "application/vnd.openpond.training+json;version=2";
|
|
11
|
-
var TRAINING_JOB_SUBMISSION_MAX_BYTES = 1048576;
|
|
12
|
-
var TRAINING_INPUT_ARTIFACT_MAX_BYTES = 67108864;
|
|
13
|
-
var TRAINING_API_RESPONSE_MAX_BYTES = 8388608;
|
|
14
|
-
var OpenPondProtocolError = class extends Error {
|
|
15
|
-
code;
|
|
16
|
-
constructor(code, message) {
|
|
17
|
-
super(message);
|
|
18
|
-
this.name = "OpenPondProtocolError";
|
|
19
|
-
this.code = code;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
function canonicalJson(value) {
|
|
23
|
-
return JSON.stringify(normalizeCanonicalJson(value));
|
|
24
|
-
}
|
|
25
|
-
function canonicalJsonByteLength(value) {
|
|
26
|
-
return new TextEncoder().encode(canonicalJson(value)).byteLength;
|
|
27
|
-
}
|
|
28
|
-
async function canonicalSha256(value) {
|
|
29
|
-
const bytes = new TextEncoder().encode(canonicalJson(value));
|
|
30
|
-
const digest = await globalThis.crypto.subtle.digest("SHA-256", bytes);
|
|
31
|
-
return Array.from(
|
|
32
|
-
new Uint8Array(digest),
|
|
33
|
-
(byte) => byte.toString(16).padStart(2, "0")
|
|
34
|
-
).join("");
|
|
35
|
-
}
|
|
36
|
-
function assertCanonicalPayloadSize(value, maximumBytes, label) {
|
|
37
|
-
const actualBytes = canonicalJsonByteLength(value);
|
|
38
|
-
if (actualBytes > maximumBytes) {
|
|
39
|
-
throw new OpenPondProtocolError(
|
|
40
|
-
"payload_too_large",
|
|
41
|
-
`${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function parseBoundedJson(text, maximumBytes, label) {
|
|
46
|
-
const actualBytes = new TextEncoder().encode(text).byteLength;
|
|
47
|
-
if (actualBytes > maximumBytes) {
|
|
48
|
-
throw new OpenPondProtocolError(
|
|
49
|
-
"response_too_large",
|
|
50
|
-
`${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
return JSON.parse(text);
|
|
55
|
-
} catch {
|
|
56
|
-
throw new OpenPondProtocolError(
|
|
57
|
-
"invalid_json",
|
|
58
|
-
`${label} was not valid JSON.`
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function normalizeCanonicalJson(value) {
|
|
63
|
-
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
64
|
-
return value;
|
|
65
|
-
}
|
|
66
|
-
if (typeof value === "number") {
|
|
67
|
-
if (!Number.isFinite(value)) {
|
|
68
|
-
throw new OpenPondProtocolError(
|
|
69
|
-
"non_json_value",
|
|
70
|
-
"Canonical JSON cannot contain a non-finite number."
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
return Object.is(value, -0) ? 0 : value;
|
|
74
|
-
}
|
|
75
|
-
if (Array.isArray(value)) {
|
|
76
|
-
return value.map((entry) => normalizeCanonicalJson(entry));
|
|
77
|
-
}
|
|
78
|
-
if (typeof value === "object") {
|
|
79
|
-
const prototype = Object.getPrototypeOf(value);
|
|
80
|
-
if (prototype !== Object.prototype && prototype !== null) {
|
|
81
|
-
throw new OpenPondProtocolError(
|
|
82
|
-
"non_json_value",
|
|
83
|
-
"Canonical JSON accepts only plain objects."
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
const result = {};
|
|
87
|
-
for (const key of Object.keys(value).sort()) {
|
|
88
|
-
const entry = value[key];
|
|
89
|
-
if (entry === void 0 || typeof entry === "function" || typeof entry === "symbol") {
|
|
90
|
-
throw new OpenPondProtocolError(
|
|
91
|
-
"non_json_value",
|
|
92
|
-
`Canonical JSON cannot contain ${typeof entry} at ${key}.`
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
result[key] = normalizeCanonicalJson(entry);
|
|
96
|
-
}
|
|
97
|
-
return result;
|
|
98
|
-
}
|
|
99
|
-
throw new OpenPondProtocolError(
|
|
100
|
-
"non_json_value",
|
|
101
|
-
`Canonical JSON cannot contain ${typeof value}.`
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// src/model-projects.ts
|
|
106
|
-
var IdSchema = z.string().trim().min(1).max(500);
|
|
107
|
-
var HashSchema = z.string().regex(/^[a-f0-9]{64}$/);
|
|
108
|
-
var TimestampSchema = z.string().datetime({ offset: true });
|
|
109
|
-
var ModelProjectImmutableRefSchema = z.object({
|
|
110
|
-
id: IdSchema,
|
|
111
|
-
contentHash: HashSchema
|
|
112
|
-
}).strict();
|
|
113
|
-
var ModelProjectVersionedRefSchema = ModelProjectImmutableRefSchema.extend({
|
|
114
|
-
revision: z.number().int().positive()
|
|
115
|
-
}).strict();
|
|
116
|
-
var ModelProjectBaseModelSchema = z.object({
|
|
117
|
-
schemaVersion: z.literal("openpond.baseModelPreference.v1"),
|
|
118
|
-
modelId: IdSchema,
|
|
119
|
-
revision: z.string().trim().min(1).max(256).nullable(),
|
|
120
|
-
tokenizerRevision: z.string().trim().min(1).max(256).nullable(),
|
|
121
|
-
chatTemplateHash: z.string().trim().min(8).max(256).nullable(),
|
|
122
|
-
modelAssetId: IdSchema.nullable(),
|
|
123
|
-
source: z.enum(["managed", "local", "builtin"])
|
|
124
|
-
}).strict();
|
|
125
|
-
var ModelProjectTrainingMethodSchema = z.enum([
|
|
126
|
-
"sft",
|
|
127
|
-
"dpo",
|
|
128
|
-
"grpo",
|
|
129
|
-
"ppo",
|
|
130
|
-
"sdft",
|
|
131
|
-
"opd",
|
|
132
|
-
"opsd",
|
|
133
|
-
"sdpo"
|
|
134
|
-
]);
|
|
135
|
-
var ModelProjectRecipeDocumentSchema = z.object({
|
|
136
|
-
schemaVersion: z.string().regex(/^openpond\.[A-Za-z0-9]+Recipe\.v\d+$/),
|
|
137
|
-
method: ModelProjectTrainingMethodSchema,
|
|
138
|
-
parameterization: z.enum(["lora", "full"])
|
|
139
|
-
}).catchall(z.unknown());
|
|
140
|
-
var ModelProjectTrainingSetupSchema = z.object({
|
|
141
|
-
tasksetRef: ModelProjectVersionedRefSchema.nullable().default(null),
|
|
142
|
-
rewardBindingRef: ModelProjectVersionedRefSchema.nullable().optional(),
|
|
143
|
-
tasksetRelease: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
144
|
-
harnessRelease: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
145
|
-
baseModel: ModelProjectBaseModelSchema.nullable().default(null),
|
|
146
|
-
method: ModelProjectTrainingMethodSchema.nullable().default(null),
|
|
147
|
-
destinationId: IdSchema.nullable().default(null),
|
|
148
|
-
managedRolloutPlacement: z.enum(["local", "remote"]).default("remote"),
|
|
149
|
-
managedGpuPlacementObjective: z.enum(["fast", "balanced", "economical"]).default("balanced"),
|
|
150
|
-
managedGpuRequirement: z.enum(["any", "h100_hbm3"]).default("any"),
|
|
151
|
-
runPreset: z.enum(["small", "standard", "custom", "small_experiment"]).nullable().default(null),
|
|
152
|
-
recipe: ModelProjectRecipeDocumentSchema.nullable().default(null),
|
|
153
|
-
preferredMaximumSpendUsd: z.number().nonnegative().nullable().default(null),
|
|
154
|
-
preferredRetentionDays: z.number().int().nonnegative().nullable().default(null)
|
|
155
|
-
}).strict();
|
|
156
|
-
var HostedModelProjectTrainingSetupSchema = ModelProjectTrainingSetupSchema.omit({ managedGpuRequirement: true });
|
|
157
|
-
var HostedModelProjectLinkSchema = z.object({
|
|
158
|
-
schemaVersion: z.literal("openpond.hostedModelProjectLink.v1"),
|
|
159
|
-
apiOrigin: z.string().url().refine((value) => new URL(value).origin === value, "Use a canonical API origin.").nullable().default(null),
|
|
160
|
-
teamId: IdSchema,
|
|
161
|
-
projectId: IdSchema,
|
|
162
|
-
portableProjectId: IdSchema,
|
|
163
|
-
revision: z.number().int().positive(),
|
|
164
|
-
etag: HashSchema,
|
|
165
|
-
syncedSourceRevision: z.number().int().positive(),
|
|
166
|
-
syncedAt: TimestampSchema,
|
|
167
|
-
tasksets: z.array(
|
|
168
|
-
z.object({
|
|
169
|
-
localTasksetId: IdSchema,
|
|
170
|
-
localTasksetHash: HashSchema.nullable().default(null),
|
|
171
|
-
releaseId: IdSchema,
|
|
172
|
-
releaseRevision: z.number().int().positive(),
|
|
173
|
-
releaseHash: HashSchema,
|
|
174
|
-
packageHash: HashSchema.nullable().default(null),
|
|
175
|
-
hostedTasksetId: IdSchema,
|
|
176
|
-
syncedAt: TimestampSchema
|
|
177
|
-
}).strict()
|
|
178
|
-
).max(1e4).default([])
|
|
179
|
-
}).strict();
|
|
180
|
-
var ModelProjectTasksetSyncSchema = z.object({
|
|
181
|
-
localTasksetId: IdSchema,
|
|
182
|
-
releaseId: IdSchema,
|
|
183
|
-
releaseRevision: z.number().int().positive(),
|
|
184
|
-
releaseHash: HashSchema,
|
|
185
|
-
state: z.enum(["syncing", "synced", "sync_failed"]),
|
|
186
|
-
hostedTasksetId: IdSchema.nullable().default(null),
|
|
187
|
-
lastAttemptAt: TimestampSchema,
|
|
188
|
-
syncedAt: TimestampSchema.nullable().default(null),
|
|
189
|
-
lastError: z.string().trim().min(1).max(5e3).nullable().default(null)
|
|
190
|
-
}).strict();
|
|
191
|
-
var ModelProjectSchema = z.object({
|
|
192
|
-
schemaVersion: z.literal("openpond.modelProject.v2"),
|
|
193
|
-
id: IdSchema,
|
|
194
|
-
profileId: IdSchema,
|
|
195
|
-
revision: z.number().int().positive().default(1),
|
|
196
|
-
name: z.string().trim().min(1).max(200),
|
|
197
|
-
objective: z.string().trim().max(5e3).nullable(),
|
|
198
|
-
defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
|
|
199
|
-
defaultDestinationId: IdSchema.nullable(),
|
|
200
|
-
trainingSetup: ModelProjectTrainingSetupSchema,
|
|
201
|
-
hosted: HostedModelProjectLinkSchema.nullable().default(null),
|
|
202
|
-
tasksetSyncs: z.array(ModelProjectTasksetSyncSchema).max(1e4).default([]),
|
|
203
|
-
createdAt: TimestampSchema,
|
|
204
|
-
updatedAt: TimestampSchema
|
|
205
|
-
}).strict();
|
|
206
|
-
var ModelProjectEditableSchema = ModelProjectSchema.pick({
|
|
207
|
-
id: true,
|
|
208
|
-
profileId: true,
|
|
209
|
-
name: true,
|
|
210
|
-
objective: true,
|
|
211
|
-
defaultBaseModel: true,
|
|
212
|
-
defaultDestinationId: true,
|
|
213
|
-
trainingSetup: true
|
|
214
|
-
});
|
|
215
|
-
var ModelProjectSaveRequestSchema = z.object({
|
|
216
|
-
schemaVersion: z.literal("openpond.modelProjectSave.v1"),
|
|
217
|
-
operationId: IdSchema,
|
|
218
|
-
expectedRevision: z.number().int().nonnegative(),
|
|
219
|
-
project: ModelProjectEditableSchema
|
|
220
|
-
}).strict();
|
|
221
|
-
var ModelProjectConfigurationCheckSchema = z.object({
|
|
222
|
-
schemaVersion: z.literal("openpond.modelProjectConfigurationCheck.v1"),
|
|
223
|
-
configurationHash: HashSchema,
|
|
224
|
-
projectId: IdSchema,
|
|
225
|
-
expectedRevision: z.number().int().nonnegative(),
|
|
226
|
-
checkedAt: TimestampSchema,
|
|
227
|
-
canSave: z.boolean(),
|
|
228
|
-
deferred: z.array(z.enum(["base_model", "taskset"])).max(2),
|
|
229
|
-
findings: z.array(z.object({
|
|
230
|
-
code: IdSchema,
|
|
231
|
-
severity: z.enum(["error", "warning"]),
|
|
232
|
-
message: z.string().min(1).max(5e3),
|
|
233
|
-
field: z.string().min(1).max(500).nullable()
|
|
234
|
-
}).strict()).max(100)
|
|
235
|
-
}).strict();
|
|
236
|
-
var ModelProjectBaseModelCandidateSchema = z.object({
|
|
237
|
-
id: IdSchema,
|
|
238
|
-
name: z.string().min(1).max(500),
|
|
239
|
-
available: z.boolean(),
|
|
240
|
-
preference: ModelProjectBaseModelSchema
|
|
241
|
-
}).strict();
|
|
242
|
-
var HostedModelProjectSyncSchema = z.object({
|
|
243
|
-
schemaVersion: z.literal("openpond.hostedModelProjectSync.v2"),
|
|
244
|
-
portableProjectId: IdSchema,
|
|
245
|
-
name: z.string().trim().min(1).max(200),
|
|
246
|
-
objective: z.string().trim().max(5e3).nullable(),
|
|
247
|
-
defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
|
|
248
|
-
defaultDestinationId: IdSchema.nullable(),
|
|
249
|
-
trainingSetup: HostedModelProjectTrainingSetupSchema,
|
|
250
|
-
sourceRevision: z.number().int().positive(),
|
|
251
|
-
sourceUpdatedAt: TimestampSchema,
|
|
252
|
-
expectedEtag: HashSchema.nullable().default(null)
|
|
253
|
-
}).strict();
|
|
254
|
-
var HostedModelProjectSummarySchema = z.object({
|
|
255
|
-
id: IdSchema,
|
|
256
|
-
teamId: IdSchema,
|
|
257
|
-
portableProjectId: IdSchema,
|
|
258
|
-
name: z.string().trim().min(1).max(200),
|
|
259
|
-
objective: z.string().trim().max(5e3).nullable(),
|
|
260
|
-
defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
|
|
261
|
-
defaultDestinationId: IdSchema.nullable(),
|
|
262
|
-
trainingSetup: HostedModelProjectTrainingSetupSchema,
|
|
263
|
-
sourceRevision: z.number().int().positive(),
|
|
264
|
-
sourceUpdatedAt: TimestampSchema,
|
|
265
|
-
revision: z.number().int().positive(),
|
|
266
|
-
etag: HashSchema,
|
|
267
|
-
createdAt: TimestampSchema,
|
|
268
|
-
updatedAt: TimestampSchema
|
|
269
|
-
}).strict();
|
|
270
|
-
var ModelProjectResourceSummarySchema = z.object({
|
|
271
|
-
kind: z.enum([
|
|
272
|
-
"taskset_release",
|
|
273
|
-
"harness_release",
|
|
274
|
-
"dataset_release",
|
|
275
|
-
"evidence_set",
|
|
276
|
-
"model_version",
|
|
277
|
-
"reward_model_version",
|
|
278
|
-
"evaluation_receipt"
|
|
279
|
-
]),
|
|
280
|
-
ref: ModelProjectImmutableRefSchema,
|
|
281
|
-
role: z.string().trim().min(1).max(200).nullable().default(null),
|
|
282
|
-
updatedAt: TimestampSchema
|
|
283
|
-
}).strict();
|
|
284
|
-
var HostedModelProjectDetailSchema = z.object({
|
|
285
|
-
project: HostedModelProjectSummarySchema,
|
|
286
|
-
resources: z.array(ModelProjectResourceSummarySchema).max(1e4),
|
|
287
|
-
jobCount: z.number().int().nonnegative(),
|
|
288
|
-
latestJobIds: z.array(IdSchema).max(100)
|
|
289
|
-
}).strict();
|
|
290
|
-
var ModelProjectApiErrorSchema = z.object({
|
|
291
|
-
schemaVersion: z.literal("openpond.modelProjectApiError.v2"),
|
|
292
|
-
code: z.string().trim().min(1).max(200),
|
|
293
|
-
message: z.string().trim().min(1).max(5e3),
|
|
294
|
-
retryable: z.boolean().default(false),
|
|
295
|
-
requestId: z.string().trim().min(1).max(500).nullable().default(null),
|
|
296
|
-
details: z.record(z.string(), z.unknown()).default({})
|
|
297
|
-
}).strict();
|
|
298
|
-
|
|
299
|
-
// src/training.ts
|
|
300
|
-
var IdSchema2 = z2.string().trim().min(1).max(500);
|
|
301
|
-
var HashSchema2 = z2.string().regex(/^[a-f0-9]{64}$/);
|
|
302
|
-
var TimestampSchema2 = z2.string().datetime({ offset: true });
|
|
303
|
-
var TrainingInputArtifactUploadSchema = z2.object({
|
|
304
|
-
schemaVersion: z2.literal("openpond.trainingInputArtifactUpload.v2"),
|
|
305
|
-
kind: z2.enum(["portable_training_bundle", "reward_model_dataset"]),
|
|
306
|
-
idempotencyKey: z2.string().trim().min(1).max(500),
|
|
307
|
-
sourceManifest: ModelProjectImmutableRefSchema,
|
|
308
|
-
payload: z2.unknown(),
|
|
309
|
-
contentHash: HashSchema2
|
|
310
|
-
}).strict();
|
|
311
|
-
var TrainingInputArtifactSchema = z2.object({
|
|
312
|
-
schemaVersion: z2.literal("openpond.trainingInputArtifact.v2"),
|
|
313
|
-
kind: z2.enum(["portable_training_bundle", "reward_model_dataset"]),
|
|
314
|
-
sourceManifest: ModelProjectImmutableRefSchema,
|
|
315
|
-
artifactRef: z2.string().trim().min(1).max(2e3),
|
|
316
|
-
contentHash: HashSchema2,
|
|
317
|
-
sizeBytes: z2.number().int().positive(),
|
|
318
|
-
createdAt: TimestampSchema2
|
|
319
|
-
}).strict();
|
|
320
|
-
async function trainingInputArtifactUploadHash(upload) {
|
|
321
|
-
const { contentHash: _contentHash, ...content } = upload;
|
|
322
|
-
return canonicalSha256(content);
|
|
323
|
-
}
|
|
324
|
-
async function parseAndVerifyTrainingInputArtifactUpload(value) {
|
|
325
|
-
assertCanonicalPayloadSize(
|
|
326
|
-
value,
|
|
327
|
-
TRAINING_INPUT_ARTIFACT_MAX_BYTES,
|
|
328
|
-
"Training input artifact"
|
|
329
|
-
);
|
|
330
|
-
const parsed = TrainingInputArtifactUploadSchema.parse(value);
|
|
331
|
-
const expectedHash = await trainingInputArtifactUploadHash(parsed);
|
|
332
|
-
if (parsed.contentHash !== expectedHash) {
|
|
333
|
-
throw new OpenPondProtocolError(
|
|
334
|
-
"content_hash_mismatch",
|
|
335
|
-
`Training input artifact contentHash ${parsed.contentHash} does not match ${expectedHash}.`
|
|
336
|
-
);
|
|
337
|
-
}
|
|
338
|
-
return parsed;
|
|
339
|
-
}
|
|
340
|
-
var TrainingJobKindSchema = z2.enum([
|
|
341
|
-
"reward_model_train",
|
|
342
|
-
"policy_optimize"
|
|
343
|
-
]);
|
|
344
|
-
var TrainingJobStateSchema = z2.enum([
|
|
345
|
-
"queued",
|
|
346
|
-
"admitting",
|
|
347
|
-
"provisioning",
|
|
348
|
-
"running",
|
|
349
|
-
"stopping",
|
|
350
|
-
"cancelling",
|
|
351
|
-
"succeeded",
|
|
352
|
-
"failed",
|
|
353
|
-
"cancelled"
|
|
354
|
-
]);
|
|
355
|
-
var TrainingCapabilityRequirementSchema = z2.object({
|
|
356
|
-
id: IdSchema2,
|
|
357
|
-
version: z2.string().trim().min(1).max(200).nullable().default(null),
|
|
358
|
-
required: z2.boolean().default(true)
|
|
359
|
-
}).strict();
|
|
360
|
-
var TrainingJobSourceSchema = z2.object({
|
|
361
|
-
modelProject: z2.object({
|
|
362
|
-
id: IdSchema2,
|
|
363
|
-
portableProjectId: IdSchema2,
|
|
364
|
-
revision: z2.number().int().positive(),
|
|
365
|
-
contentHash: HashSchema2
|
|
366
|
-
}).strict(),
|
|
367
|
-
harnessRunManifest: ModelProjectImmutableRefSchema,
|
|
368
|
-
harnessRelease: ModelProjectImmutableRefSchema,
|
|
369
|
-
taskset: ModelProjectVersionedRefSchema,
|
|
370
|
-
tasksetRelease: ModelProjectImmutableRefSchema,
|
|
371
|
-
dataset: ModelProjectImmutableRefSchema,
|
|
372
|
-
evidenceSets: z2.array(ModelProjectImmutableRefSchema).max(1e4)
|
|
373
|
-
}).strict();
|
|
374
|
-
var RewardModelTrainingRequestSchema = z2.object({
|
|
375
|
-
kind: z2.literal("reward_model_train"),
|
|
376
|
-
baseModel: ModelProjectBaseModelSchema,
|
|
377
|
-
preferenceDatasetRelease: ModelProjectImmutableRefSchema,
|
|
378
|
-
processorRelease: ModelProjectImmutableRefSchema,
|
|
379
|
-
recipe: z2.object({
|
|
380
|
-
schemaVersion: z2.literal("openpond.rewardModelRecipe.v1"),
|
|
381
|
-
method: z2.literal("reward_model"),
|
|
382
|
-
parameterization: z2.literal("lora_with_scalar_head")
|
|
383
|
-
}).catchall(z2.unknown())
|
|
384
|
-
}).strict();
|
|
385
|
-
var DeterministicRewardSourceSchema = z2.object({
|
|
386
|
-
kind: z2.literal("deterministic"),
|
|
387
|
-
grader: ModelProjectImmutableRefSchema,
|
|
388
|
-
composer: ModelProjectImmutableRefSchema.nullable().default(null)
|
|
389
|
-
}).strict();
|
|
390
|
-
var LearnedRewardSourceSchema = z2.object({
|
|
391
|
-
kind: z2.literal("learned_reward"),
|
|
392
|
-
rewardModelVersion: ModelProjectImmutableRefSchema,
|
|
393
|
-
qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
394
|
-
evaluationReferences: z2.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
|
|
395
|
-
scorerArtifact: z2.object({
|
|
396
|
-
artifactRef: z2.string().trim().min(1).max(2e3),
|
|
397
|
-
contentHash: HashSchema2,
|
|
398
|
-
executionReceipt: ModelProjectImmutableRefSchema
|
|
399
|
-
}).strict(),
|
|
400
|
-
processorRelease: ModelProjectImmutableRefSchema,
|
|
401
|
-
rewardComposerRelease: ModelProjectImmutableRefSchema
|
|
402
|
-
}).strict();
|
|
403
|
-
var PolicyOptimizationRequestSchema = z2.object({
|
|
404
|
-
kind: z2.literal("policy_optimize"),
|
|
405
|
-
baseModel: ModelProjectBaseModelSchema,
|
|
406
|
-
recipe: ModelProjectRecipeDocumentSchema,
|
|
407
|
-
rewardSource: z2.discriminatedUnion("kind", [
|
|
408
|
-
DeterministicRewardSourceSchema,
|
|
409
|
-
LearnedRewardSourceSchema
|
|
410
|
-
]),
|
|
411
|
-
resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
|
|
412
|
-
}).strict();
|
|
413
|
-
var TrainingJobRequestSchema = z2.discriminatedUnion("kind", [
|
|
1
|
+
import {
|
|
2
|
+
OpenPondTrainingApiError,
|
|
3
|
+
PolicyOptimizationRequestSchema,
|
|
414
4
|
RewardModelTrainingRequestSchema,
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
TRAINING_JOB_SUBMISSION_MAX_BYTES,
|
|
456
|
-
"Training Job submission"
|
|
457
|
-
);
|
|
458
|
-
const parsed = TrainingJobSubmissionSchema.parse(value);
|
|
459
|
-
const expectedHash = await trainingJobSubmissionHash(parsed);
|
|
460
|
-
if (parsed.contentHash !== expectedHash) {
|
|
461
|
-
throw new OpenPondProtocolError(
|
|
462
|
-
"content_hash_mismatch",
|
|
463
|
-
`Training Job contentHash ${parsed.contentHash} does not match ${expectedHash}.`
|
|
464
|
-
);
|
|
465
|
-
}
|
|
466
|
-
return parsed;
|
|
467
|
-
}
|
|
468
|
-
var TrainingJobSchema = z2.object({
|
|
469
|
-
schemaVersion: z2.literal("openpond.trainingJob.v2"),
|
|
470
|
-
id: IdSchema2,
|
|
471
|
-
teamId: IdSchema2,
|
|
472
|
-
kind: TrainingJobKindSchema,
|
|
473
|
-
modelProjectId: IdSchema2,
|
|
474
|
-
portableProjectId: IdSchema2,
|
|
475
|
-
sourceProjectRevision: z2.number().int().positive(),
|
|
476
|
-
submissionHash: HashSchema2,
|
|
477
|
-
state: TrainingJobStateSchema,
|
|
478
|
-
phase: z2.string().trim().min(1).max(200),
|
|
479
|
-
version: z2.number().int().nonnegative(),
|
|
480
|
-
progress: z2.number().min(0).max(1),
|
|
481
|
-
rolloutProgress: z2.object({
|
|
482
|
-
groupsCompleted: z2.number().int().nonnegative(),
|
|
483
|
-
groupsTarget: z2.number().int().nonnegative(),
|
|
484
|
-
optimizerUpdatesApplied: z2.number().int().nonnegative(),
|
|
485
|
-
optimizerUpdatesSkipped: z2.number().int().nonnegative()
|
|
486
|
-
}).strict(),
|
|
487
|
-
accruedSpendUsd: z2.number().nonnegative(),
|
|
488
|
-
terminalReason: z2.string().trim().min(1).max(5e3).nullable(),
|
|
489
|
-
createdAt: TimestampSchema2,
|
|
490
|
-
updatedAt: TimestampSchema2,
|
|
491
|
-
completedAt: TimestampSchema2.nullable()
|
|
492
|
-
}).strict();
|
|
493
|
-
var TrainingJobPageSchema = z2.object({
|
|
494
|
-
schemaVersion: z2.literal("openpond.trainingJobPage.v2"),
|
|
495
|
-
jobs: z2.array(TrainingJobSchema).max(1e3),
|
|
496
|
-
nextCursor: z2.string().trim().min(1).max(2e3).nullable()
|
|
497
|
-
}).strict();
|
|
498
|
-
var TrainingJobEventSchema = z2.object({
|
|
499
|
-
schemaVersion: z2.literal("openpond.trainingJobEvent.v2"),
|
|
500
|
-
id: IdSchema2,
|
|
501
|
-
jobId: IdSchema2,
|
|
502
|
-
sequence: z2.number().int().nonnegative(),
|
|
503
|
-
type: IdSchema2,
|
|
504
|
-
phase: z2.string().trim().min(1).max(200),
|
|
505
|
-
message: z2.string().trim().min(1).max(5e3).nullable(),
|
|
506
|
-
data: z2.record(z2.string(), z2.unknown()).default({}),
|
|
507
|
-
createdAt: TimestampSchema2
|
|
508
|
-
}).strict();
|
|
509
|
-
var TrainingJobLogSchema = z2.object({
|
|
510
|
-
schemaVersion: z2.literal("openpond.trainingJobLog.v2"),
|
|
511
|
-
jobId: IdSchema2,
|
|
512
|
-
sequence: z2.number().int().nonnegative(),
|
|
513
|
-
level: z2.enum(["debug", "info", "warning", "error"]),
|
|
514
|
-
message: z2.string().max(2e4),
|
|
515
|
-
createdAt: TimestampSchema2
|
|
516
|
-
}).strict();
|
|
517
|
-
var TrainingJobControlRequestSchema = z2.object({ expectedVersion: z2.number().int().nonnegative() }).strict();
|
|
518
|
-
var TrainingJobOutputSchema = z2.object({
|
|
519
|
-
schemaVersion: z2.literal("openpond.trainingJobOutput.v2"),
|
|
520
|
-
id: IdSchema2,
|
|
521
|
-
jobId: IdSchema2,
|
|
522
|
-
kind: z2.enum([
|
|
523
|
-
"checkpoint",
|
|
524
|
-
"adapter",
|
|
525
|
-
"scorer",
|
|
526
|
-
"metrics",
|
|
527
|
-
"evaluation",
|
|
528
|
-
"trace",
|
|
529
|
-
"receipt"
|
|
530
|
-
]),
|
|
531
|
-
artifactRef: z2.string().trim().min(1).max(2e3),
|
|
532
|
-
contentHash: HashSchema2,
|
|
533
|
-
sizeBytes: z2.number().int().nonnegative(),
|
|
534
|
-
metadata: z2.record(z2.string(), z2.unknown()).default({}),
|
|
535
|
-
createdAt: TimestampSchema2
|
|
536
|
-
}).strict();
|
|
537
|
-
var TrainingExecutionReceiptSchema = z2.object({
|
|
538
|
-
schemaVersion: z2.literal("openpond.trainingExecutionReceipt.v2"),
|
|
539
|
-
id: IdSchema2,
|
|
540
|
-
teamId: IdSchema2,
|
|
541
|
-
jobId: IdSchema2,
|
|
542
|
-
submissionHash: HashSchema2,
|
|
543
|
-
manifestHash: HashSchema2,
|
|
544
|
-
recipeHash: HashSchema2,
|
|
545
|
-
capabilityHash: HashSchema2,
|
|
546
|
-
runtimeRelease: ModelProjectImmutableRefSchema,
|
|
547
|
-
inputs: z2.array(ModelProjectImmutableRefSchema).max(1e4),
|
|
548
|
-
outputs: z2.array(ModelProjectImmutableRefSchema).max(1e4),
|
|
549
|
-
spendUsd: z2.number().nonnegative(),
|
|
550
|
-
durationSeconds: z2.number().nonnegative(),
|
|
551
|
-
cleanupComplete: z2.boolean(),
|
|
552
|
-
issuer: IdSchema2,
|
|
553
|
-
issuedAt: TimestampSchema2,
|
|
554
|
-
signature: z2.string().trim().min(1).max(1e4).nullable()
|
|
555
|
-
}).strict();
|
|
556
|
-
async function trainingExecutionReceiptHash(receipt) {
|
|
557
|
-
return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));
|
|
558
|
-
}
|
|
559
|
-
async function parseAndVerifyTrainingExecutionReceipt(value, expected) {
|
|
560
|
-
const receipt = TrainingExecutionReceiptSchema.parse(value);
|
|
561
|
-
const expectedId = IdSchema2.parse(expected.id);
|
|
562
|
-
const expectedHash = HashSchema2.parse(expected.contentHash);
|
|
563
|
-
const actualHash = await trainingExecutionReceiptHash(receipt);
|
|
564
|
-
if (receipt.id !== expectedId || actualHash !== expectedHash) {
|
|
565
|
-
throw new OpenPondProtocolError(
|
|
566
|
-
"execution_receipt_mismatch",
|
|
567
|
-
"The execution receipt identity or canonical content hash did not match."
|
|
568
|
-
);
|
|
569
|
-
}
|
|
570
|
-
if (expected.teamId !== void 0 && receipt.teamId !== IdSchema2.parse(expected.teamId)) {
|
|
571
|
-
throw new OpenPondProtocolError(
|
|
572
|
-
"execution_receipt_team_mismatch",
|
|
573
|
-
"The execution receipt belongs to a different team."
|
|
574
|
-
);
|
|
575
|
-
}
|
|
576
|
-
if (expected.jobId !== void 0 && receipt.jobId !== IdSchema2.parse(expected.jobId)) {
|
|
577
|
-
throw new OpenPondProtocolError(
|
|
578
|
-
"execution_receipt_job_mismatch",
|
|
579
|
-
"The execution receipt belongs to a different Training Job."
|
|
580
|
-
);
|
|
581
|
-
}
|
|
582
|
-
if ((expected.requireCleanup ?? true) && !receipt.cleanupComplete) {
|
|
583
|
-
throw new OpenPondProtocolError(
|
|
584
|
-
"execution_cleanup_incomplete",
|
|
585
|
-
"The execution receipt does not attest complete terminal cleanup."
|
|
586
|
-
);
|
|
587
|
-
}
|
|
588
|
-
return receipt;
|
|
589
|
-
}
|
|
590
|
-
var TrainingJobOutputsSchema = z2.object({
|
|
591
|
-
schemaVersion: z2.literal("openpond.trainingJobOutputs.v2"),
|
|
592
|
-
outputs: z2.array(TrainingJobOutputSchema).max(1e4),
|
|
593
|
-
receipt: TrainingExecutionReceiptSchema.nullable()
|
|
594
|
-
}).strict();
|
|
595
|
-
var TrainingApiErrorSchema = z2.object({
|
|
596
|
-
schemaVersion: z2.literal("openpond.trainingApiError.v2"),
|
|
597
|
-
code: z2.string().trim().min(1).max(200),
|
|
598
|
-
message: z2.string().trim().min(1).max(5e3),
|
|
599
|
-
retryable: z2.boolean().default(false),
|
|
600
|
-
requestId: z2.string().trim().min(1).max(500).nullable().default(null),
|
|
601
|
-
details: z2.record(z2.string(), z2.unknown()).default({})
|
|
602
|
-
}).strict();
|
|
603
|
-
var OpenPondTrainingApiError = class extends Error {
|
|
604
|
-
status;
|
|
605
|
-
code;
|
|
606
|
-
retryable;
|
|
607
|
-
requestId;
|
|
608
|
-
details;
|
|
609
|
-
constructor(status, error) {
|
|
610
|
-
super(error.message);
|
|
611
|
-
this.name = "OpenPondTrainingApiError";
|
|
612
|
-
this.status = status;
|
|
613
|
-
this.code = error.code;
|
|
614
|
-
this.retryable = error.retryable;
|
|
615
|
-
this.requestId = error.requestId;
|
|
616
|
-
this.details = error.details;
|
|
617
|
-
}
|
|
618
|
-
};
|
|
619
|
-
var TrainingCapabilitiesSchema = z2.object({
|
|
620
|
-
schemaVersion: z2.literal("openpond.trainingCapabilities.v2"),
|
|
621
|
-
capabilityHash: HashSchema2,
|
|
622
|
-
jobKinds: z2.array(TrainingJobKindSchema),
|
|
623
|
-
methods: z2.array(z2.string().trim().min(1).max(200)),
|
|
624
|
-
placements: z2.array(
|
|
625
|
-
z2.enum(["local", "remote", "colocated", "provider_native"])
|
|
626
|
-
),
|
|
627
|
-
controls: z2.object({
|
|
628
|
-
cancel: z2.boolean(),
|
|
629
|
-
stopAfterGroup: z2.boolean(),
|
|
630
|
-
resumeFromCheckpoint: z2.boolean()
|
|
631
|
-
}).strict(),
|
|
632
|
-
limits: z2.object({
|
|
633
|
-
maximumSpendUsd: z2.number().nonnegative(),
|
|
634
|
-
maximumWallSeconds: z2.number().int().positive(),
|
|
635
|
-
maximumArtifactBytes: z2.number().int().positive()
|
|
636
|
-
}).strict(),
|
|
637
|
-
checkedAt: TimestampSchema2,
|
|
638
|
-
expiresAt: TimestampSchema2
|
|
639
|
-
}).strict();
|
|
640
|
-
function headersRecord(headers) {
|
|
641
|
-
const result = {};
|
|
642
|
-
new Headers(headers).forEach((value, key) => {
|
|
643
|
-
result[key] = value;
|
|
644
|
-
});
|
|
645
|
-
return result;
|
|
646
|
-
}
|
|
647
|
-
function createTrainingClient(input) {
|
|
648
|
-
const fetchImpl = input.fetch ?? fetch;
|
|
649
|
-
const baseUrl = input.baseUrl.replace(/\/$/, "");
|
|
650
|
-
async function request(pathname, init) {
|
|
651
|
-
const readOnly = init?.method === void 0 || init.method.toUpperCase() === "GET";
|
|
652
|
-
const maximumAttempts = readOnly ? 3 : 1;
|
|
653
|
-
for (let attempt = 1; attempt <= maximumAttempts; attempt += 1) {
|
|
654
|
-
let response;
|
|
655
|
-
try {
|
|
656
|
-
const configuredHeaders = typeof input.headers === "function" ? await input.headers() : input.headers ?? {};
|
|
657
|
-
response = await fetchImpl(`${baseUrl}${pathname}`, {
|
|
658
|
-
...init,
|
|
659
|
-
headers: {
|
|
660
|
-
accept: OPENPOND_TRAINING_MEDIA_TYPE,
|
|
661
|
-
...init?.body ? { "content-type": OPENPOND_TRAINING_MEDIA_TYPE } : {},
|
|
662
|
-
...headersRecord(configuredHeaders),
|
|
663
|
-
...headersRecord(init?.headers)
|
|
664
|
-
}
|
|
665
|
-
});
|
|
666
|
-
} catch (error2) {
|
|
667
|
-
if (attempt === maximumAttempts || init?.signal?.aborted || !trainingReadFailureIsRetryable(null, error2)) {
|
|
668
|
-
throw error2;
|
|
669
|
-
}
|
|
670
|
-
await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));
|
|
671
|
-
continue;
|
|
672
|
-
}
|
|
673
|
-
const body = parseBoundedJson(
|
|
674
|
-
await response.text(),
|
|
675
|
-
TRAINING_API_RESPONSE_MAX_BYTES,
|
|
676
|
-
"Training API response"
|
|
677
|
-
);
|
|
678
|
-
if (response.ok) return body;
|
|
679
|
-
const error = trainingApiError(body, response.status);
|
|
680
|
-
if (attempt === maximumAttempts || !trainingReadFailureIsRetryable(response.status, error)) {
|
|
681
|
-
throw error;
|
|
682
|
-
}
|
|
683
|
-
await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));
|
|
684
|
-
}
|
|
685
|
-
throw new OpenPondProtocolError(
|
|
686
|
-
"training_read_retry_exhausted",
|
|
687
|
-
"Training read retry loop exhausted without a response."
|
|
688
|
-
);
|
|
689
|
-
}
|
|
690
|
-
return {
|
|
691
|
-
async capabilities() {
|
|
692
|
-
return TrainingCapabilitiesSchema.parse(
|
|
693
|
-
unwrapObject(await request("/v1/training/capabilities"), "capabilities")
|
|
694
|
-
);
|
|
695
|
-
},
|
|
696
|
-
async stageArtifact(upload) {
|
|
697
|
-
const parsed = await parseAndVerifyTrainingInputArtifactUpload(upload);
|
|
698
|
-
return TrainingInputArtifactSchema.parse(
|
|
699
|
-
unwrapObject(
|
|
700
|
-
await request("/v1/training/artifacts", {
|
|
701
|
-
method: "POST",
|
|
702
|
-
body: JSON.stringify(parsed)
|
|
703
|
-
}),
|
|
704
|
-
"artifact"
|
|
705
|
-
)
|
|
706
|
-
);
|
|
707
|
-
},
|
|
708
|
-
async createJob(submission) {
|
|
709
|
-
const parsed = await parseAndVerifyTrainingJobSubmission(submission);
|
|
710
|
-
return TrainingJobSchema.parse(
|
|
711
|
-
unwrapObject(
|
|
712
|
-
await request("/v1/training/jobs", {
|
|
713
|
-
method: "POST",
|
|
714
|
-
body: JSON.stringify(parsed)
|
|
715
|
-
}),
|
|
716
|
-
"job"
|
|
717
|
-
)
|
|
718
|
-
);
|
|
719
|
-
},
|
|
720
|
-
async listJobs(options = {}) {
|
|
721
|
-
const parameters = new URLSearchParams();
|
|
722
|
-
if (options.modelProjectId) {
|
|
723
|
-
parameters.set("modelProjectId", IdSchema2.parse(options.modelProjectId));
|
|
724
|
-
}
|
|
725
|
-
if (options.cursor) {
|
|
726
|
-
parameters.set("cursor", z2.string().trim().min(1).max(2e3).parse(options.cursor));
|
|
727
|
-
}
|
|
728
|
-
if (options.limit !== void 0) {
|
|
729
|
-
parameters.set(
|
|
730
|
-
"limit",
|
|
731
|
-
String(z2.number().int().min(1).max(1e3).parse(options.limit))
|
|
732
|
-
);
|
|
733
|
-
}
|
|
734
|
-
const query = parameters.size > 0 ? `?${parameters.toString()}` : "";
|
|
735
|
-
return TrainingJobPageSchema.parse(
|
|
736
|
-
await request(`/v1/training/jobs${query}`)
|
|
737
|
-
);
|
|
738
|
-
},
|
|
739
|
-
async getJob(jobId) {
|
|
740
|
-
return TrainingJobSchema.parse(
|
|
741
|
-
unwrapObject(
|
|
742
|
-
await request(`/v1/training/jobs/${encodeURIComponent(IdSchema2.parse(jobId))}`),
|
|
743
|
-
"job"
|
|
744
|
-
)
|
|
745
|
-
);
|
|
746
|
-
},
|
|
747
|
-
async cancelJob(jobId, expectedVersion) {
|
|
748
|
-
const control = TrainingJobControlRequestSchema.parse({ expectedVersion });
|
|
749
|
-
return TrainingJobSchema.parse(
|
|
750
|
-
unwrapObject(
|
|
751
|
-
await request(
|
|
752
|
-
`/v1/training/jobs/${encodeURIComponent(IdSchema2.parse(jobId))}/cancel`,
|
|
753
|
-
{ method: "POST", body: JSON.stringify(control) }
|
|
754
|
-
),
|
|
755
|
-
"job"
|
|
756
|
-
)
|
|
757
|
-
);
|
|
758
|
-
},
|
|
759
|
-
async stopAfterGroup(jobId, expectedVersion) {
|
|
760
|
-
const control = TrainingJobControlRequestSchema.parse({ expectedVersion });
|
|
761
|
-
return TrainingJobSchema.parse(
|
|
762
|
-
unwrapObject(
|
|
763
|
-
await request(
|
|
764
|
-
`/v1/training/jobs/${encodeURIComponent(IdSchema2.parse(jobId))}/stop-after-group`,
|
|
765
|
-
{ method: "POST", body: JSON.stringify(control) }
|
|
766
|
-
),
|
|
767
|
-
"job"
|
|
768
|
-
)
|
|
769
|
-
);
|
|
770
|
-
},
|
|
771
|
-
async events(jobId) {
|
|
772
|
-
return z2.array(TrainingJobEventSchema).parse(
|
|
773
|
-
unwrapObject(
|
|
774
|
-
await request(
|
|
775
|
-
`/v1/training/jobs/${encodeURIComponent(IdSchema2.parse(jobId))}/events`
|
|
776
|
-
),
|
|
777
|
-
"events"
|
|
778
|
-
)
|
|
779
|
-
);
|
|
780
|
-
},
|
|
781
|
-
async outputs(jobId) {
|
|
782
|
-
return TrainingJobOutputsSchema.parse(
|
|
783
|
-
await request(
|
|
784
|
-
`/v1/training/jobs/${encodeURIComponent(IdSchema2.parse(jobId))}/outputs`
|
|
785
|
-
)
|
|
786
|
-
);
|
|
787
|
-
},
|
|
788
|
-
async logs(jobId) {
|
|
789
|
-
return z2.array(TrainingJobLogSchema).max(1e5).parse(
|
|
790
|
-
unwrapObject(
|
|
791
|
-
await request(
|
|
792
|
-
`/v1/training/jobs/${encodeURIComponent(IdSchema2.parse(jobId))}/logs`
|
|
793
|
-
),
|
|
794
|
-
"logs"
|
|
795
|
-
)
|
|
796
|
-
);
|
|
797
|
-
}
|
|
798
|
-
};
|
|
799
|
-
}
|
|
800
|
-
function trainingReadFailureIsRetryable(status, error) {
|
|
801
|
-
if (status !== null) {
|
|
802
|
-
return status === 408 || status === 429 || status >= 500;
|
|
803
|
-
}
|
|
804
|
-
if (error instanceof OpenPondTrainingApiError) return error.retryable;
|
|
805
|
-
if (error instanceof OpenPondProtocolError) {
|
|
806
|
-
return error.code === "invalid_error_response";
|
|
807
|
-
}
|
|
808
|
-
return error instanceof TypeError;
|
|
809
|
-
}
|
|
810
|
-
function unwrapObject(value, key) {
|
|
811
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return value;
|
|
812
|
-
return key in value ? value[key] : value;
|
|
813
|
-
}
|
|
814
|
-
function trainingApiError(value, status) {
|
|
815
|
-
const parsed = TrainingApiErrorSchema.safeParse(value);
|
|
816
|
-
if (parsed.success) {
|
|
817
|
-
return new OpenPondTrainingApiError(status, parsed.data);
|
|
818
|
-
}
|
|
819
|
-
return new OpenPondProtocolError(
|
|
820
|
-
"invalid_error_response",
|
|
821
|
-
`Training request failed with HTTP ${status} and an invalid error envelope.`
|
|
822
|
-
);
|
|
823
|
-
}
|
|
5
|
+
TrainingApiErrorSchema,
|
|
6
|
+
TrainingCapabilitiesSchema,
|
|
7
|
+
TrainingCapabilityRequirementSchema,
|
|
8
|
+
TrainingExecutionReceiptSchema,
|
|
9
|
+
TrainingInputArtifactSchema,
|
|
10
|
+
TrainingInputArtifactUploadSchema,
|
|
11
|
+
TrainingJobApprovalSchema,
|
|
12
|
+
TrainingJobControlRequestSchema,
|
|
13
|
+
TrainingJobEventSchema,
|
|
14
|
+
TrainingJobKindSchema,
|
|
15
|
+
TrainingJobLogSchema,
|
|
16
|
+
TrainingJobOutputSchema,
|
|
17
|
+
TrainingJobOutputsSchema,
|
|
18
|
+
TrainingJobPageSchema,
|
|
19
|
+
TrainingJobRequestSchema,
|
|
20
|
+
TrainingJobSchema,
|
|
21
|
+
TrainingJobSourceSchema,
|
|
22
|
+
TrainingJobStateSchema,
|
|
23
|
+
TrainingJobSubmissionSchema,
|
|
24
|
+
createTrainingClient,
|
|
25
|
+
parseAndVerifyTrainingExecutionReceipt,
|
|
26
|
+
parseAndVerifyTrainingInputArtifactUpload,
|
|
27
|
+
parseAndVerifyTrainingJobSubmission,
|
|
28
|
+
trainingExecutionReceiptHash,
|
|
29
|
+
trainingInputArtifactUploadHash,
|
|
30
|
+
trainingJobSubmissionHash
|
|
31
|
+
} from "./chunk-AVW35YOH.js";
|
|
32
|
+
import {
|
|
33
|
+
OPENPOND_TRAINING_MEDIA_TYPE,
|
|
34
|
+
OPENPOND_TRAINING_PROTOCOL_MAJOR,
|
|
35
|
+
OpenPondProtocolError,
|
|
36
|
+
TRAINING_API_RESPONSE_MAX_BYTES,
|
|
37
|
+
TRAINING_INPUT_ARTIFACT_MAX_BYTES,
|
|
38
|
+
TRAINING_JOB_SUBMISSION_MAX_BYTES,
|
|
39
|
+
assertCanonicalPayloadSize,
|
|
40
|
+
canonicalJson,
|
|
41
|
+
canonicalJsonByteLength,
|
|
42
|
+
canonicalSha256,
|
|
43
|
+
parseBoundedJson
|
|
44
|
+
} from "./chunk-5PRP457R.js";
|
|
824
45
|
export {
|
|
825
46
|
OPENPOND_TRAINING_MEDIA_TYPE,
|
|
826
47
|
OPENPOND_TRAINING_PROTOCOL_MAJOR,
|