openpond-sdk 0.5.14 → 0.5.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LEARNING.md +12 -0
  2. package/TRAINING_PROTOCOL.md +6 -0
  3. package/dist/{chunk-F5JBFRAH.js → chunk-GZOXT7YE.js} +228 -185
  4. package/dist/chunk-GZOXT7YE.js.map +7 -0
  5. package/dist/{chunk-LV4TDE5S.js → chunk-IIZV2N5F.js} +2 -2
  6. package/dist/{chunk-7VZB24CH.js → chunk-NHMZCVZO.js} +2 -2
  7. package/dist/{chunk-4IDTRFW2.js → chunk-NZ35HEEK.js} +2 -1
  8. package/dist/{chunk-4IDTRFW2.js.map → chunk-NZ35HEEK.js.map} +2 -2
  9. package/dist/{chunk-6QWV5TEJ.js → chunk-SMWHGQ5W.js} +2 -2
  10. package/dist/{chunk-WSTMQGOY.js → chunk-TLXDZ4VG.js} +6 -6
  11. package/dist/{chunk-WSTMQGOY.js.map → chunk-TLXDZ4VG.js.map} +2 -2
  12. package/dist/model-starter-catalog.js +2 -2
  13. package/dist/model-starters.js +2 -2
  14. package/dist/taskset-drafts.js +4 -4
  15. package/dist/taskset-packages.js +5 -5
  16. package/dist/training-bundle.js +66 -15
  17. package/dist/training-bundle.js.map +4 -4
  18. package/dist/training.js +5 -1
  19. package/dist/types/packages/sdk/src/learning-batch-assets.d.ts +62 -0
  20. package/dist/types/packages/sdk/src/learning-batch-assets.d.ts.map +1 -0
  21. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts +18 -0
  22. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts.map +1 -1
  23. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts +14 -0
  24. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts.map +1 -1
  25. package/dist/types/packages/sdk/src/model-batch-review.d.ts +14 -0
  26. package/dist/types/packages/sdk/src/model-batch-review.d.ts.map +1 -1
  27. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts +14 -0
  28. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts.map +1 -1
  29. package/dist/types/packages/sdk/src/model-starters.d.ts +32 -0
  30. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  31. package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts +18 -0
  32. package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts.map +1 -1
  33. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +1 -1
  34. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +1 -1
  35. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +2 -2
  36. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +5 -5
  37. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +1 -1
  38. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +1 -1
  39. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +14 -0
  40. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -1
  41. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +2 -2
  42. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +2 -2
  43. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +54 -0
  44. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  45. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts +36 -0
  46. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts.map +1 -1
  47. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +15 -1
  48. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -1
  49. package/dist/types/packages/sdk/src/training-harness-sources.d.ts +141 -0
  50. package/dist/types/packages/sdk/src/training-harness-sources.d.ts.map +1 -0
  51. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +5 -2
  52. package/dist/types/packages/sdk/src/training-learning-batch.d.ts.map +1 -1
  53. package/dist/types/packages/sdk/src/training.d.ts +127 -0
  54. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  55. package/package.json +2 -2
  56. package/dist/chunk-F5JBFRAH.js.map +0 -7
  57. /package/dist/{chunk-LV4TDE5S.js.map → chunk-IIZV2N5F.js.map} +0 -0
  58. /package/dist/{chunk-7VZB24CH.js.map → chunk-NHMZCVZO.js.map} +0 -0
  59. /package/dist/{chunk-6QWV5TEJ.js.map → chunk-SMWHGQ5W.js.map} +0 -0
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  ModelStarterSchema,
3
3
  validateResolvedModelStarter
4
- } from "./chunk-6QWV5TEJ.js";
5
- import "./chunk-4IDTRFW2.js";
4
+ } from "./chunk-SMWHGQ5W.js";
5
+ import "./chunk-NZ35HEEK.js";
6
6
  import {
7
7
  ModelProjectVersionedRefSchema
8
8
  } from "./chunk-ZNFOVV7B.js";
@@ -11,7 +11,7 @@ import {
11
11
  previewModelStarter,
12
12
  validateModelStarterCreation,
13
13
  validateResolvedModelStarter
14
- } from "./chunk-6QWV5TEJ.js";
14
+ } from "./chunk-SMWHGQ5W.js";
15
15
  import {
16
16
  ModelStarterEnvironmentAttemptSchema,
17
17
  ModelStarterExecutionSchema,
@@ -28,7 +28,7 @@ import {
28
28
  resolveModelTasksetExecutionResourcesAsset,
29
29
  validateModelTasksetPackage,
30
30
  verifyModelStarterEnvironmentAttempt
31
- } from "./chunk-4IDTRFW2.js";
31
+ } from "./chunk-NZ35HEEK.js";
32
32
  import "./chunk-ZNFOVV7B.js";
33
33
  export {
34
34
  ModelStarterContentSchema,
@@ -27,7 +27,7 @@ import {
27
27
  saveTasksetDraftWorkspaceFile,
28
28
  tasksetDraftFromTaskset,
29
29
  validateTasksetDraftWorkspace
30
- } from "./chunk-LV4TDE5S.js";
30
+ } from "./chunk-IIZV2N5F.js";
31
31
  import {
32
32
  AuthoringProvenanceSchema,
33
33
  AuthoringRepairSchema,
@@ -97,8 +97,8 @@ import {
97
97
  isTrainingSourceRef,
98
98
  validatePortability,
99
99
  validateTaskset
100
- } from "./chunk-WSTMQGOY.js";
101
- import "./chunk-4IDTRFW2.js";
100
+ } from "./chunk-TLXDZ4VG.js";
101
+ import "./chunk-NZ35HEEK.js";
102
102
  import {
103
103
  ModelTasksetDraftRequestSchema,
104
104
  TasksetDraftFileInfoSchema,
@@ -106,7 +106,7 @@ import {
106
106
  TasksetDraftFilePathSchema,
107
107
  TasksetDraftFileSchema
108
108
  } from "./chunk-S7I45WJQ.js";
109
- import "./chunk-F5JBFRAH.js";
109
+ import "./chunk-GZOXT7YE.js";
110
110
  import "./chunk-A4ZDOZKP.js";
111
111
  import "./chunk-5FBPNWT4.js";
112
112
  import {
@@ -13,7 +13,7 @@ import {
13
13
  projectPortableTaskRecord,
14
14
  projectPreferenceComparisonRelease,
15
15
  resolvePortableTasksetRewardExecution
16
- } from "./chunk-7VZB24CH.js";
16
+ } from "./chunk-NHMZCVZO.js";
17
17
  import {
18
18
  OpenPondTasksetPackageClient,
19
19
  OpenPondTasksetPackageError,
@@ -30,7 +30,7 @@ import {
30
30
  publishTasksetDraft,
31
31
  renderTasksetDraftManifests,
32
32
  validateTasksetDraftWorkspace
33
- } from "./chunk-LV4TDE5S.js";
33
+ } from "./chunk-IIZV2N5F.js";
34
34
  import {
35
35
  GraderFixtureSchema,
36
36
  MAX_TASKSET_PACKAGE_BYTES,
@@ -53,11 +53,11 @@ import {
53
53
  tasksetPackageRewardBinding,
54
54
  validateTasksetLearningResources,
55
55
  validateTasksetPackage
56
- } from "./chunk-WSTMQGOY.js";
56
+ } from "./chunk-TLXDZ4VG.js";
57
57
  import {
58
58
  ModelStarterExecutionSchema,
59
59
  modelStarterExecutionAssetId
60
- } from "./chunk-4IDTRFW2.js";
60
+ } from "./chunk-NZ35HEEK.js";
61
61
  import {
62
62
  ModelTasksetAuthoringOwnerSchema,
63
63
  ModelTasksetAuthoringSchema,
@@ -69,7 +69,7 @@ import {
69
69
  TasksetDraftFilePathSchema,
70
70
  TasksetDraftFileSchema
71
71
  } from "./chunk-S7I45WJQ.js";
72
- import "./chunk-F5JBFRAH.js";
72
+ import "./chunk-GZOXT7YE.js";
73
73
  import "./chunk-A4ZDOZKP.js";
74
74
  import "./chunk-5FBPNWT4.js";
75
75
  import {
@@ -2,13 +2,14 @@ import {
2
2
  learningVerifierModule,
3
3
  projectLearningBatchGraders,
4
4
  resolvePortableTasksetRewardExecution
5
- } from "./chunk-7VZB24CH.js";
5
+ } from "./chunk-NHMZCVZO.js";
6
6
  import {
7
7
  LearningBatchDatasetSourceRefSchema,
8
+ MAX_TASKSET_PACKAGE_BYTES,
8
9
  TasksetSchema,
9
10
  computeTasksetHash
10
- } from "./chunk-WSTMQGOY.js";
11
- import "./chunk-4IDTRFW2.js";
11
+ } from "./chunk-TLXDZ4VG.js";
12
+ import "./chunk-NZ35HEEK.js";
12
13
  import "./chunk-S7I45WJQ.js";
13
14
  import {
14
15
  TRAINING_EVALUATION_SOURCE_PATH,
@@ -19,7 +20,7 @@ import {
19
20
  trainingEvaluationSourceRef,
20
21
  trainingInputArtifactUploadHash,
21
22
  trainingJobSubmissionHash
22
- } from "./chunk-F5JBFRAH.js";
23
+ } from "./chunk-GZOXT7YE.js";
23
24
  import {
24
25
  HarnessSourceSelectionSchema,
25
26
  createAgentSnapshot,
@@ -39,7 +40,7 @@ import "./chunk-ZNFOVV7B.js";
39
40
 
40
41
  // src/training-bundle.ts
41
42
  import { compileBoundGraders } from "@openpond/evals/rewards";
42
- import { verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals/learning";
43
+ import { verifyLearningTextAsset as verifyLearningTextAsset3 } from "@openpond/evals/learning";
43
44
 
44
45
  // src/training-bundle-contracts.ts
45
46
  import { z } from "zod";
@@ -179,12 +180,50 @@ function scanAndRedactEvidence(text) {
179
180
  }
180
181
 
181
182
  // src/training-learning-batch.ts
182
- import { compileTaskBatch, learningRef, taskBatchPackageMetadata, verifyLearningTextAsset } from "@openpond/evals";
183
+ import { compileTaskBatch, learningRef, taskBatchPackageMetadata, verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals";
184
+
185
+ // src/learning-batch-assets.ts
186
+ import { verifyLearningTextAsset } from "@openpond/evals/learning";
187
+ function materializeLearningBatchAssets(input) {
188
+ const tasksetAssetBytes = /* @__PURE__ */ new Map();
189
+ const tasks = input.tasks.map(({ artifactRefs, ...task }) => ({
190
+ ...task,
191
+ assets: artifactRefs.map((asset2) => {
192
+ if (asset2.visibility !== "policy") throw new Error("Learning task inputs must be policy-visible assets.");
193
+ const stored = input.assets?.find((value) => value.id === asset2.id);
194
+ const bytes2 = input.assetBytes?.get(asset2.id) ?? (stored ? new TextEncoder().encode(verifyLearningTextAsset(stored, asset2)) : void 0);
195
+ if (!bytes2 || bytes2.byteLength !== asset2.sizeBytes || sha256(bytes2) !== asset2.contentHash) throw new Error(`Learning task input bytes are missing or changed: ${asset2.id}.`);
196
+ const artifactRef = `learning/assets/${contentHash({ task: task.id, asset: asset2.id }).slice(0, 40)}/${asset2.path}`;
197
+ tasksetAssetBytes.set(artifactRef, new Uint8Array(bytes2));
198
+ return {
199
+ id: asset2.id,
200
+ sourceRefId: input.sourceId,
201
+ artifactRef,
202
+ fileName: asset2.path.split("/").at(-1),
203
+ mediaType: asset2.mediaType,
204
+ sha256: asset2.contentHash,
205
+ sizeBytes: asset2.sizeBytes,
206
+ split: task.split,
207
+ metadata: { portableAsset: asset2 }
208
+ };
209
+ }),
210
+ ...task.requiredOutputs ? { requiredOutputs: task.requiredOutputs.map((output) => ({
211
+ ...output,
212
+ schemaRef: output.schemaRef?.id ?? null,
213
+ maxBytes: output.maxBytes ?? void 0
214
+ })) } : {}
215
+ }));
216
+ return { tasks, tasksetAssetBytes };
217
+ }
218
+
219
+ // src/training-learning-batch.ts
183
220
  function materializeLearningBatchTaskset(input) {
184
221
  const release = compileTaskBatch(input);
185
222
  const metadata = taskBatchPackageMetadata(release);
186
- if (release.environment.kind !== "text" || release.tools.length || release.tasks.some((task) => task.artifactRefs.length)) throw new Error("This learning batch requires an environment or asset adapter before training preparation.");
223
+ const work = release.environment.kind === "work";
224
+ if (!work && (release.environment.kind !== "text" || release.tools.length || release.tasks.some((task) => task.artifactRefs.length)) || work && release.tasks.some((task) => !task.requiredOutputs?.length)) throw new Error("This learning batch requires a supported text or Work environment with declared outputs.");
187
225
  const sourceId = input.source.id;
226
+ const materialized = materializeLearningBatchAssets({ tasks: release.tasks, sourceId, assets: input.assets, assetBytes: input.assetBytes });
188
227
  const signals = { demonstrations: [], preferences: [], corrections: [], feedback: [], rewards: [], labels: [] };
189
228
  const fixtures = [];
190
229
  for (const admission of metadata.admissions) {
@@ -219,7 +258,7 @@ function materializeLearningBatchTaskset(input) {
219
258
  const asset2 = input.assets?.find((asset3) => asset3.id === grader.verifierRef.id);
220
259
  if (!asset2) throw new Error(`Reward ${grader.id} is missing its immutable verifier source.`);
221
260
  const module = learningVerifierModule(grader.verifierRef.contentHash);
222
- if (!generatedFiles.some((file) => file.path === module)) generatedFiles.push({ path: module, role: "verifier", content: verifyLearningTextAsset(asset2, grader.verifierRef) });
261
+ if (!generatedFiles.some((file) => file.path === module)) generatedFiles.push({ path: module, role: "verifier", content: verifyLearningTextAsset2(asset2, grader.verifierRef) });
223
262
  }
224
263
  const taskset = TasksetSchema.parse({
225
264
  schemaVersion: "openpond.taskset.v1",
@@ -236,9 +275,9 @@ function materializeLearningBatchTaskset(input) {
236
275
  sourceRefs: [input.source],
237
276
  datasetArtifact: null,
238
277
  policy: release.policy,
239
- environment: { protocolVersion: "openpond.taskEnvironment.v1", kind: "chat", entrypoint: "openpond.text.v1", stateful: false, deterministicSeeds: release.environment.deterministicSeeds, toolNames: [], lifecycle: ["create", "reset", "step", "grade", "cleanup"], defaultTimeoutMs: release.environment.defaultTimeoutMs, networkPolicy: release.environment.networkPolicy, metadata: { portableEnvironment: release.environment } },
240
- capabilities: { schemaVersion: "openpond.tasksetCapabilities.v1", taskKind: "chat", supportedSignals: signals.demonstrations.length ? ["demonstration", "reward"] : ["reward"], compatibleMethods: input.batch.purpose === "supervised_training" ? ["sft"] : input.batch.purpose === "reward_training" ? ["grpo", "ppo"] : ["none"], rewardKinds: ["deterministic"], requiresTools: false, requiresState: false, requiresPrivilegedGrading: true, environmentPlacements: ["local", "remote"], exportable: true, portabilityBlockers: [] },
241
- tasks: release.tasks.map(({ artifactRefs: _assets, ...task }) => ({ ...task, schemaVersion: "openpond.taskData.v1", sourceRefs: [sourceId], metadata: { admission: metadata.admissions.find((entry) => entry.taskId === task.id), exampleOrigin: input.evidence.find((evidence) => evidence.id === task.id)?.correctionFeedbackId ? "corrected" : "extracted" } })),
278
+ environment: { protocolVersion: "openpond.taskEnvironment.v1", kind: work ? "work" : "chat", entrypoint: release.environment.entrypoint, stateful: release.environment.stateful, deterministicSeeds: release.environment.deterministicSeeds, toolNames: release.tools.map((tool) => tool.name), lifecycle: ["create", "reset", "step", "grade", "cleanup"], defaultTimeoutMs: release.environment.defaultTimeoutMs, networkPolicy: release.environment.networkPolicy, metadata: { portableEnvironment: release.environment, portableTools: release.tools } },
279
+ capabilities: { schemaVersion: "openpond.tasksetCapabilities.v1", taskKind: work ? "single_agent" : "chat", supportedSignals: signals.demonstrations.length ? ["demonstration", "reward"] : ["reward"], compatibleMethods: input.batch.purpose === "supervised_training" ? ["sft"] : input.batch.purpose === "reward_training" ? ["grpo", "ppo"] : ["none"], rewardKinds: ["deterministic"], requiresTools: release.tools.length > 0, requiresState: release.environment.stateful, requiresPrivilegedGrading: true, environmentPlacements: ["local", "remote"], exportable: true, portabilityBlockers: [] },
280
+ tasks: materialized.tasks.map((task) => ({ ...task, schemaVersion: "openpond.taskData.v1", sourceRefs: [sourceId], metadata: { admission: metadata.admissions.find((entry) => entry.taskId === task.id), exampleOrigin: input.evidence.find((evidence) => evidence.id === task.id)?.correctionFeedbackId ? "corrected" : "extracted" } })),
242
281
  graders,
243
282
  graderFixtures: fixtures,
244
283
  learningSignals: signals,
@@ -247,9 +286,9 @@ function materializeLearningBatchTaskset(input) {
247
286
  contentHash: "00000000",
248
287
  createdAt: input.batch.sealedAt,
249
288
  updatedAt: input.batch.sealedAt,
250
- metadata: { learning: metadata, learningRelease: learningRef(release), trainingMethod: input.batch.purpose === "supervised_training" ? "sft" : input.batch.purpose === "reward_training" ? "grpo" : "none", tasksetOutputContract: { mode: "structured_json", jsonSchema: input.definition.outputSchema, renderer: null } }
289
+ metadata: { learning: metadata, learningRelease: learningRef(release), trainingMethod: input.batch.purpose === "supervised_training" ? "sft" : input.batch.purpose === "reward_training" ? "grpo" : "none", tasksetOutputContract: work ? { mode: "artifacts", requiredOutputSource: "task.requiredOutputs" } : { mode: "structured_json", jsonSchema: input.definition.outputSchema, renderer: null } }
251
290
  });
252
- return { taskset: TasksetSchema.parse({ ...taskset, contentHash: computeTasksetHash(taskset) }), release, generatedFiles };
291
+ return { taskset: TasksetSchema.parse({ ...taskset, contentHash: computeTasksetHash(taskset) }), release, generatedFiles, tasksetAssetBytes: materialized.tasksetAssetBytes };
253
292
  }
254
293
  function fixtureOutcome(grade) {
255
294
  if (!grade) return null;
@@ -258,10 +297,22 @@ function fixtureOutcome(grade) {
258
297
  return { passed: outcome.passed === true, rewardEligible: grade.training.status === "scored" };
259
298
  }
260
299
  function prepareReviewedLearningBatch(input) {
300
+ const inputAssetText = [];
301
+ let inputAssetSize = 0;
302
+ for (const ref of new Map(input.evidence.flatMap((item) => item.submission.assets.map((ref2) => [ref2.id, ref2]))).values()) {
303
+ const bytes2 = input.assetBytes?.get(ref.id);
304
+ const stored = input.assets?.find((asset2) => asset2.id === ref.id);
305
+ const size = bytes2?.byteLength ?? (stored ? new TextEncoder().encode(stored.text).byteLength : 0);
306
+ inputAssetSize += size;
307
+ if (inputAssetSize > MAX_TASKSET_PACKAGE_BYTES) throw new Error("Learning input assets exceed the training package limit.");
308
+ if (bytes2) inputAssetText.push(new TextDecoder().decode(bytes2));
309
+ else if (stored) inputAssetText.push(stored.text);
310
+ }
261
311
  const scan = scanAndRedactEvidence(JSON.stringify({
262
312
  tasks: input.evidence.map((item) => item.submission),
263
313
  targets: input.decisions.map((item) => item.approvedTarget),
264
- definition: input.definition
314
+ definition: input.definition,
315
+ inputAssets: inputAssetText
265
316
  }));
266
317
  if (scan.secretStatus !== "passed" || scan.piiStatus !== "passed") throw new Error(`Learning batch contains unresolved data findings (${scan.findings.join(", ")}). Correct the source examples and seal a revised batch before training.`);
267
318
  const source = LearningBatchDatasetSourceRefSchema.parse({
@@ -704,7 +755,7 @@ function buildTasksetTrainingBundle(input) {
704
755
  for (const reference of references) {
705
756
  const asset2 = verifierAssets.find((asset3) => asset3.id === reference.id);
706
757
  if (!asset2 || reference.visibility !== "verifier") throw new Error("Training bundle requires its private verifier asset.");
707
- verifyLearningTextAsset2(asset2, reference);
758
+ verifyLearningTextAsset3(asset2, reference);
708
759
  }
709
760
  addJsonAsset(assets, "reward-binding.json", { kind: "reward_binding_v1", binding: rewardExecution.binding, rewards: rewardExecution.rewards, assets: verifierAssets });
710
761
  } else if (input.verifierAssets?.length) {