openpond-sdk 0.2.0 → 0.2.1
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/MODEL_STARTERS.md +47 -0
- package/dist/model-starter-catalog.js +86 -54
- package/dist/model-starter-catalog.js.map +4 -4
- package/dist/model-starters.js +212 -47
- package/dist/model-starters.js.map +4 -4
- package/dist/types/packages/sdk/src/model-starters.d.ts +2 -0
- package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts +987 -0
- package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/model-taskset-resources.d.ts +198 -0
- package/dist/types/packages/sdk/src/model-taskset-resources.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/model-starters.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/model-starters.ts
|
|
2
|
-
import { z as
|
|
3
|
-
import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
|
|
4
|
-
import { LearningTextAssetSchema, TaskDefinitionSchema, learningRef as
|
|
5
|
-
import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
|
|
6
|
-
import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue } from "@openpond/evals/task-schema";
|
|
2
|
+
import { z as z5 } from "zod";
|
|
3
|
+
import { TasksetReleaseSchema as TasksetReleaseSchema2, assertTasksetRelease as assertTasksetRelease2 } from "@openpond/evals/tasksets";
|
|
4
|
+
import { LearningTextAssetSchema as LearningTextAssetSchema2, TaskDefinitionSchema as TaskDefinitionSchema2, learningRef as learningRef3, sameLearningRef as sameLearningRef2, sealLearningContent as sealLearningContent4 } from "@openpond/evals/learning";
|
|
5
|
+
import { RewardBindingSchema as RewardBindingSchema2, RewardReleaseSchema as RewardReleaseSchema2, compileBoundGraders as compileBoundGraders2 } from "@openpond/evals/rewards";
|
|
6
|
+
import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue as validateTaskValue2 } from "@openpond/evals/task-schema";
|
|
7
7
|
|
|
8
8
|
// src/model-projects.ts
|
|
9
9
|
import { z } from "zod";
|
|
@@ -357,29 +357,186 @@ function validateModelStarterExecution(execution, taskset, assets) {
|
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
+
// src/model-taskset-derivation.ts
|
|
361
|
+
import { z as z4 } from "zod";
|
|
362
|
+
import { createEnvironmentRelease, createVerifierSetRelease, verifyEnvironmentRelease as verifyEnvironmentRelease2, verifyVerifierSetRelease as verifyVerifierSetRelease2 } from "@openpond/evals";
|
|
363
|
+
import { LearningTextAssetSchema, TaskDefinitionSchema, assertLearningContentHash, learningRef as learningRef2, sameLearningRef, sealLearningContent as sealLearningContent3, verifyLearningTextAsset as verifyLearningTextAsset3 } from "@openpond/evals/learning";
|
|
364
|
+
import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
|
|
365
|
+
import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
|
|
366
|
+
import { validateTaskValue } from "@openpond/evals/task-schema";
|
|
367
|
+
|
|
368
|
+
// src/model-taskset-resources.ts
|
|
369
|
+
import { z as z3 } from "zod";
|
|
370
|
+
import { EnvironmentReleaseSchema as EnvironmentReleaseSchema2, VerifierSetReleaseSchema as VerifierSetReleaseSchema2, verifyEnvironmentRelease, verifyVerifierSetRelease } from "@openpond/evals";
|
|
371
|
+
import { createLearningTextAsset as createLearningTextAsset2, sealLearningContent as sealLearningContent2, verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals/learning";
|
|
372
|
+
var ModelTasksetExecutionResourcesSchema = z3.object({ environment: EnvironmentReleaseSchema2, verifierSet: VerifierSetReleaseSchema2 }).strict();
|
|
373
|
+
function modelTasksetExecutionResourcesAssetId(context) {
|
|
374
|
+
if (!context.environmentRelease || !context.verifierSetRelease) throw new Error("Taskset execution references are missing.");
|
|
375
|
+
return `taskset-execution-${sealLearningContent2({ environment: context.environmentRelease, verifiers: context.verifierSetRelease }).contentHash}`;
|
|
376
|
+
}
|
|
377
|
+
function createModelTasksetExecutionResourcesAsset(value) {
|
|
378
|
+
const resources = ModelTasksetExecutionResourcesSchema.parse({ environment: value.environment, verifierSet: value.verifierSet });
|
|
379
|
+
assertIntegrity(resources);
|
|
380
|
+
const id = modelTasksetExecutionResourcesAssetId({ environmentRelease: { id: resources.environment.id, contentHash: resources.environment.contentHash }, verifierSetRelease: { id: resources.verifierSet.id, contentHash: resources.verifierSet.contentHash } });
|
|
381
|
+
const { contentHash: _hash, ...asset } = createLearningTextAsset2({ text: canonicalJson(resources), path: "environment/resources.json", mediaType: "application/json", visibility: "host_private" });
|
|
382
|
+
return sealLearningContent2({ ...asset, id, asset: { ...asset.asset, id } });
|
|
383
|
+
}
|
|
384
|
+
function resolveModelTasksetExecutionResourcesAsset(context, asset) {
|
|
385
|
+
if (asset.id !== modelTasksetExecutionResourcesAssetId(context) || asset.asset.visibility !== "host_private" || asset.asset.mediaType !== "application/json") throw new Error("Taskset execution asset differs from its published references.");
|
|
386
|
+
const resources = ModelTasksetExecutionResourcesSchema.parse(JSON.parse(verifyLearningTextAsset2(asset, asset.asset)));
|
|
387
|
+
assertIntegrity(resources);
|
|
388
|
+
if (asset.id !== createModelTasksetExecutionResourcesAsset(resources).id || canonicalJson(context.environment) !== canonicalJson(resources.environment.contract) || canonicalJson(context.graders) !== canonicalJson(resources.verifierSet.graders)) throw new Error("Taskset differs from its execution resources.");
|
|
389
|
+
return resources;
|
|
390
|
+
}
|
|
391
|
+
function assertIntegrity(resources) {
|
|
392
|
+
if (!verifyEnvironmentRelease(resources.environment) || !verifyVerifierSetRelease(resources.verifierSet)) throw new Error("Taskset execution resource integrity failed.");
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// src/model-taskset-derivation.ts
|
|
396
|
+
var OwnerSchema = z4.object({ scopeId: z4.string().trim().min(1).max(500), modelId: z4.string().trim().min(1).max(500) }).strict();
|
|
397
|
+
var ModelTasksetDerivationSchema = z4.object({
|
|
398
|
+
schemaVersion: z4.literal("openpond.modelTasksetDerivation.v1"),
|
|
399
|
+
owner: OwnerSchema,
|
|
400
|
+
root: ModelProjectVersionedRefSchema,
|
|
401
|
+
parent: ModelProjectVersionedRefSchema
|
|
402
|
+
}).strict();
|
|
403
|
+
var ModelTasksetPackageSchema = z4.object({
|
|
404
|
+
taskset: TasksetReleaseSchema,
|
|
405
|
+
taskDefinition: TaskDefinitionSchema,
|
|
406
|
+
rewardBinding: RewardBindingSchema,
|
|
407
|
+
rewards: z4.array(RewardReleaseSchema).min(1).max(100),
|
|
408
|
+
assets: z4.array(LearningTextAssetSchema).max(1e3),
|
|
409
|
+
executionResources: ModelTasksetExecutionResourcesSchema.optional(),
|
|
410
|
+
execution: ModelStarterExecutionSchema.optional()
|
|
411
|
+
}).strict();
|
|
412
|
+
var same = (left, right) => sealLearningContent3({ value: left }).contentHash === sealLearningContent3({ value: right }).contentHash;
|
|
413
|
+
var identity = (owner, root) => `model-taskset-${sealLearningContent3({ owner, root }).contentHash}`;
|
|
414
|
+
function deriveModelTaskset(input) {
|
|
415
|
+
const owner = OwnerSchema.parse(input.owner);
|
|
416
|
+
const source = validateModelTasksetPackage(input.source);
|
|
417
|
+
const previous = source.taskset.metadata.modelTasksetDerivation === void 0 ? null : ModelTasksetDerivationSchema.parse(source.taskset.metadata.modelTasksetDerivation);
|
|
418
|
+
if (previous && source.taskset.id !== identity(previous.owner, previous.root)) throw new Error("Derived Taskset identity differs from its ownership lineage.");
|
|
419
|
+
const owned = previous && same(previous.owner, owner);
|
|
420
|
+
const root = owned ? previous.root : learningRef2(source.taskset);
|
|
421
|
+
const id = owned ? source.taskset.id : identity(owner, root);
|
|
422
|
+
const revision = owned ? source.taskset.revision + 1 : 1;
|
|
423
|
+
const rewardBinding = RewardBindingSchema.parse(input.rewardBinding);
|
|
424
|
+
const rewards = input.rewards.map((reward) => RewardReleaseSchema.parse(reward));
|
|
425
|
+
const graders = compileBoundGraders(rewardBinding, rewards);
|
|
426
|
+
if (rewardBinding.recipeRef) throw new Error("Resolve the Reward recipe into one standalone binding before deriving a Taskset.");
|
|
427
|
+
const policy = { ...source.taskset.policy, hiddenGraderRefs: graders.filter((grader) => grader.privileged).map((grader) => grader.id) };
|
|
428
|
+
const previousResources = source.executionResources ?? source.execution;
|
|
429
|
+
const environment = previousResources?.environment ?? createEnvironmentRelease({
|
|
430
|
+
schemaVersion: "openpond.environmentRelease.v1",
|
|
431
|
+
id: `${id}-environment`,
|
|
432
|
+
revision: 1,
|
|
433
|
+
contract: source.taskset.environment,
|
|
434
|
+
actionSchemaRef: null,
|
|
435
|
+
observationSchemaRef: null,
|
|
436
|
+
stateSchemaRef: null,
|
|
437
|
+
artifactCollection: { maxArtifacts: 1e5, maxTotalBytes: 25e7 },
|
|
438
|
+
adapterConformanceHashes: {},
|
|
439
|
+
metadata: {}
|
|
440
|
+
});
|
|
441
|
+
const verifierSet = createVerifierSetRelease({
|
|
442
|
+
schemaVersion: "openpond.verifierSetRelease.v1",
|
|
443
|
+
id: `${id}-verifiers`,
|
|
444
|
+
revision,
|
|
445
|
+
graders,
|
|
446
|
+
isolation: previousResources?.verifierSet.isolation ?? { processBoundary: "isolated_process", networkPolicy: "none", defaultTimeoutMs: Math.min(source.taskset.environment.defaultTimeoutMs, 3e5) },
|
|
447
|
+
calibrationReceiptRefs: [],
|
|
448
|
+
metadata: previousResources ? { sourceVerifierSet: learningRef2(previousResources.verifierSet) } : {}
|
|
449
|
+
});
|
|
450
|
+
const executionResources = { environment, verifierSet };
|
|
451
|
+
const execution = source.execution ? { ...source.execution, verifierSet } : void 0;
|
|
452
|
+
const { contentHash: _taskHash, ...taskContent } = source.taskset;
|
|
453
|
+
const { contentHash: _definitionHash, ...definitionContent } = source.taskDefinition;
|
|
454
|
+
const taskExecution = { ...definitionContent.execution, policy, environmentRelease: { id: environment.id, contentHash: environment.contentHash }, verifierSetRelease: { id: verifierSet.id, contentHash: verifierSet.contentHash } };
|
|
455
|
+
const taskDefinition = TaskDefinitionSchema.parse(sealLearningContent3({ ...definitionContent, id: `${id}-definition`, revision, rewardBinding: learningRef2(rewardBinding), execution: taskExecution }));
|
|
456
|
+
const authoring = source.taskset.metadata.starterAuthoring;
|
|
457
|
+
const graderFixtures = authoring && typeof authoring === "object" && !Array.isArray(authoring) && "graderFixtures" in authoring ? authoring.graderFixtures : void 0;
|
|
458
|
+
const taskset = TasksetReleaseSchema.parse(sealLearningContent3({
|
|
459
|
+
...taskContent,
|
|
460
|
+
...taskExecution,
|
|
461
|
+
id,
|
|
462
|
+
revision,
|
|
463
|
+
graders,
|
|
464
|
+
metadata: {
|
|
465
|
+
starter: { taskDefinition: learningRef2(taskDefinition), rewardBinding: learningRef2(rewardBinding) },
|
|
466
|
+
rewardExecution: { binding: rewardBinding, rewards },
|
|
467
|
+
...graderFixtures === void 0 ? {} : { starterAuthoring: { graderFixtures } },
|
|
468
|
+
modelTasksetDerivation: { schemaVersion: "openpond.modelTasksetDerivation.v1", owner, root, parent: learningRef2(source.taskset) }
|
|
469
|
+
}
|
|
470
|
+
}));
|
|
471
|
+
return validateModelTasksetPackage({ taskset, taskDefinition, rewardBinding, rewards, assets: input.assets, executionResources, ...execution ? { execution } : {} });
|
|
472
|
+
}
|
|
473
|
+
function validateModelTasksetPackage(value) {
|
|
474
|
+
const result = ModelTasksetPackageSchema.parse(value);
|
|
475
|
+
const { taskset, taskDefinition, rewardBinding, rewards, assets, execution } = result;
|
|
476
|
+
for (const resource of [taskset, taskDefinition, rewardBinding, ...rewards, ...assets]) assertLearningContentHash(resource);
|
|
477
|
+
assertTasksetRelease(taskset);
|
|
478
|
+
if (rewardBinding.recipeRef) throw new Error("Resolve the Reward recipe into one standalone binding before deriving a Taskset.");
|
|
479
|
+
if (!sameLearningRef(taskDefinition.rewardBinding, learningRef2(rewardBinding))) throw new Error("Taskset definition differs from its Reward binding.");
|
|
480
|
+
const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;
|
|
481
|
+
if (!same(taskDefinition.execution, { policy, environment, ...environmentRelease ? { environmentRelease } : {}, tools, capabilities, ...verifierSetRelease ? { verifierSetRelease } : {} })) throw new Error("Taskset definition differs from its execution resources.");
|
|
482
|
+
if (!same(taskset.graders, compileBoundGraders(rewardBinding, rewards))) throw new Error("Taskset graders differ from its Reward binding.");
|
|
483
|
+
if (taskset.metadata.starter !== void 0) {
|
|
484
|
+
const metadata = z4.object({ taskDefinition: ModelProjectVersionedRefSchema, rewardBinding: ModelProjectVersionedRefSchema }).passthrough().parse(taskset.metadata.starter);
|
|
485
|
+
if (!sameLearningRef(metadata.taskDefinition, learningRef2(taskDefinition)) || !sameLearningRef(metadata.rewardBinding, learningRef2(rewardBinding))) throw new Error("Taskset metadata differs from its immutable grading resources.");
|
|
486
|
+
}
|
|
487
|
+
if (taskset.metadata.rewardExecution !== void 0 && !same(taskset.metadata.rewardExecution, { binding: rewardBinding, rewards })) throw new Error("Taskset embedded Rewards differ from its immutable grading resources.");
|
|
488
|
+
if (taskset.metadata.rewardBinding !== void 0 && !sameLearningRef(ModelProjectVersionedRefSchema.parse(taskset.metadata.rewardBinding), learningRef2(rewardBinding))) throw new Error("Taskset Reward reference differs from its immutable grading resources.");
|
|
489
|
+
const resources = result.executionResources ?? execution;
|
|
490
|
+
if (taskset.environmentRelease && !resources) throw new Error("Deriving a Taskset requires its pinned execution resources.");
|
|
491
|
+
if (resources && (!verifyEnvironmentRelease2(resources.environment) || !verifyVerifierSetRelease2(resources.verifierSet) || !same(taskset.environmentRelease, { id: resources.environment.id, contentHash: resources.environment.contentHash }) || !same(taskset.verifierSetRelease, { id: resources.verifierSet.id, contentHash: resources.verifierSet.contentHash }) || !same(taskset.environment, resources.environment.contract) || !same(taskset.graders, resources.verifierSet.graders))) throw new Error("Taskset differs from its pinned execution resources.");
|
|
492
|
+
validateModelStarterExecution(execution, taskset, assets);
|
|
493
|
+
if (new Set(assets.map((asset) => asset.id)).size !== assets.length) throw new Error("Taskset asset identities must be unique.");
|
|
494
|
+
for (const asset of assets) verifyLearningTextAsset3(asset, asset.asset);
|
|
495
|
+
for (const reference of resources ? [resources.environment.actionSchemaRef, resources.environment.observationSchemaRef, resources.environment.stateSchemaRef] : []) {
|
|
496
|
+
if (!reference) continue;
|
|
497
|
+
const asset = assets.find((asset2) => asset2.id === reference.id);
|
|
498
|
+
if (!asset) throw new Error(`Taskset environment asset is missing: ${reference.id}.`);
|
|
499
|
+
verifyLearningTextAsset3(asset, reference);
|
|
500
|
+
}
|
|
501
|
+
for (const task of taskset.tasks) {
|
|
502
|
+
if (task.policyVisibleContext.instructions !== taskDefinition.instructions || !validateTaskValue(taskDefinition.inputSchema, task.input).valid || task.expectedOutput !== null && !validateTaskValue(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Taskset task differs from its declared format: ${task.id}.`);
|
|
503
|
+
if (task.privilegedContextRef && !assets.some((asset) => asset.id === task.privilegedContextRef && asset.asset.visibility === "host_private")) throw new Error(`Taskset private context is missing: ${task.id}.`);
|
|
504
|
+
}
|
|
505
|
+
for (const reward of rewards) {
|
|
506
|
+
const implementation = reward.implementation;
|
|
507
|
+
const references = [...reward.assets, ..."verifierRef" in implementation ? [implementation.verifierRef] : [], ..."rubricRef" in implementation ? [implementation.rubricRef] : [], ..."inputContract" in implementation ? [implementation.inputContract] : []];
|
|
508
|
+
for (const reference of references) {
|
|
509
|
+
const asset = assets.find((asset2) => asset2.id === reference.id);
|
|
510
|
+
if (!asset || reference.visibility === "policy") throw new Error(`Taskset Reward requires its private asset: ${reference.id}.`);
|
|
511
|
+
verifyLearningTextAsset3(asset, reference);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return result;
|
|
515
|
+
}
|
|
516
|
+
|
|
360
517
|
// src/model-starters.ts
|
|
361
|
-
var IdSchema2 =
|
|
518
|
+
var IdSchema2 = z5.string().trim().min(1).max(500);
|
|
362
519
|
var RefSchema = ModelProjectVersionedRefSchema;
|
|
363
|
-
var ModelStarterContentSchema =
|
|
364
|
-
schemaVersion:
|
|
520
|
+
var ModelStarterContentSchema = z5.object({
|
|
521
|
+
schemaVersion: z5.literal("openpond.modelStarter.v1"),
|
|
365
522
|
id: IdSchema2,
|
|
366
|
-
revision:
|
|
367
|
-
name:
|
|
368
|
-
description:
|
|
369
|
-
category:
|
|
523
|
+
revision: z5.number().int().positive(),
|
|
524
|
+
name: z5.string().trim().min(1).max(200),
|
|
525
|
+
description: z5.string().trim().min(1).max(2e3),
|
|
526
|
+
category: z5.enum(["extraction", "support", "operations", "knowledge", "coding", "writing", "classification"]),
|
|
370
527
|
taskset: RefSchema,
|
|
371
528
|
taskDefinition: RefSchema,
|
|
372
529
|
rewardBinding: RefSchema,
|
|
373
|
-
rewards:
|
|
374
|
-
assets:
|
|
375
|
-
previewTaskIds:
|
|
530
|
+
rewards: z5.array(RefSchema).min(1).max(100),
|
|
531
|
+
assets: z5.array(RefSchema).max(1e3),
|
|
532
|
+
previewTaskIds: z5.array(IdSchema2).min(1).max(8),
|
|
376
533
|
startingModel: ModelProjectBaseModelSchema,
|
|
377
|
-
supportedMethods:
|
|
534
|
+
supportedMethods: z5.array(ModelProjectTrainingMethodSchema).min(1).max(8),
|
|
378
535
|
defaultMethod: ModelProjectTrainingMethodSchema,
|
|
379
|
-
provenance:
|
|
536
|
+
provenance: z5.object({ author: z5.string().min(1).max(200), license: z5.string().min(1).max(200), sourceDescription: z5.string().min(1).max(2e3) }).strict(),
|
|
380
537
|
// These are references to real results. Package publication does not create
|
|
381
538
|
// evidence, qualify a starter, or enable continuous learning.
|
|
382
|
-
evidence:
|
|
539
|
+
evidence: z5.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict()
|
|
383
540
|
}).strict().superRefine((starter, context) => {
|
|
384
541
|
if (!starter.supportedMethods.includes(starter.defaultMethod)) context.addIssue({ code: "custom", path: ["defaultMethod"], message: "The default method must be supported by the package." });
|
|
385
542
|
for (const field of ["rewards", "assets"]) {
|
|
@@ -387,23 +544,23 @@ var ModelStarterContentSchema = z3.object({
|
|
|
387
544
|
}
|
|
388
545
|
if (new Set(starter.previewTaskIds).size !== starter.previewTaskIds.length) context.addIssue({ code: "custom", path: ["previewTaskIds"], message: "Preview tasks must be unique." });
|
|
389
546
|
});
|
|
390
|
-
var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash:
|
|
391
|
-
var ResolvedModelStarterSchema =
|
|
547
|
+
var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z5.string().regex(/^[a-f0-9]{64}$/) });
|
|
548
|
+
var ResolvedModelStarterSchema = z5.object({
|
|
392
549
|
starter: ModelStarterSchema,
|
|
393
|
-
taskset:
|
|
394
|
-
taskDefinition:
|
|
395
|
-
rewardBinding:
|
|
396
|
-
rewards:
|
|
397
|
-
assets:
|
|
550
|
+
taskset: TasksetReleaseSchema2,
|
|
551
|
+
taskDefinition: TaskDefinitionSchema2,
|
|
552
|
+
rewardBinding: RewardBindingSchema2,
|
|
553
|
+
rewards: z5.array(RewardReleaseSchema2).min(1).max(100),
|
|
554
|
+
assets: z5.array(LearningTextAssetSchema2).max(1e3),
|
|
398
555
|
execution: ModelStarterExecutionSchema.optional()
|
|
399
556
|
}).strict();
|
|
400
|
-
var ModelStarterPrivacyReviewSchema =
|
|
401
|
-
schemaVersion:
|
|
402
|
-
disposition:
|
|
403
|
-
reviewedBy:
|
|
404
|
-
reviewedAt:
|
|
405
|
-
reviewedContentHash:
|
|
406
|
-
note:
|
|
557
|
+
var ModelStarterPrivacyReviewSchema = z5.object({
|
|
558
|
+
schemaVersion: z5.literal("openpond.modelStarterPrivacyReview.v1"),
|
|
559
|
+
disposition: z5.literal("synthetic_only"),
|
|
560
|
+
reviewedBy: z5.string().trim().min(1).max(500),
|
|
561
|
+
reviewedAt: z5.iso.datetime(),
|
|
562
|
+
reviewedContentHash: z5.string().regex(/^[a-f0-9]{64}$/),
|
|
563
|
+
note: z5.string().trim().min(1).max(2e3)
|
|
407
564
|
}).strict();
|
|
408
565
|
function modelStarterPrivacyContentHash(value) {
|
|
409
566
|
const { contentHash: _starterHash, ...starter } = value.starter;
|
|
@@ -415,19 +572,19 @@ function modelStarterPrivacyContentHash(value) {
|
|
|
415
572
|
const { privacyReview: _review, ...content } = authoring;
|
|
416
573
|
metadata.starterAuthoring = content;
|
|
417
574
|
}
|
|
418
|
-
return
|
|
575
|
+
return sealLearningContent4({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;
|
|
419
576
|
}
|
|
420
|
-
var ModelStarterCreationIntentSchema =
|
|
577
|
+
var ModelStarterCreationIntentSchema = z5.object({
|
|
421
578
|
profileId: IdSchema2,
|
|
422
579
|
modelId: IdSchema2,
|
|
423
|
-
name:
|
|
580
|
+
name: z5.string().trim().min(1).max(200),
|
|
424
581
|
starter: RefSchema,
|
|
425
582
|
startingModel: ModelProjectBaseModelSchema,
|
|
426
583
|
method: ModelProjectTrainingMethodSchema,
|
|
427
584
|
rewardBindingRef: RefSchema.nullable().optional()
|
|
428
585
|
}).strict();
|
|
429
586
|
var ModelStarterCreationRequestSchema = ModelStarterCreationIntentSchema.extend({
|
|
430
|
-
schemaVersion:
|
|
587
|
+
schemaVersion: z5.literal("openpond.modelStarterCreation.v1"),
|
|
431
588
|
operationId: IdSchema2
|
|
432
589
|
}).strict();
|
|
433
590
|
function parseModelStarterCreationRequest(value) {
|
|
@@ -446,7 +603,7 @@ async function createModelStarterCreationRequest(value) {
|
|
|
446
603
|
function validateModelStarterCreation(value, packageValue) {
|
|
447
604
|
const request = parseModelStarterCreationRequest(value);
|
|
448
605
|
const resolved = validateResolvedModelStarter(packageValue);
|
|
449
|
-
if (!
|
|
606
|
+
if (!sameLearningRef2(request.starter, learningRef3(resolved.starter))) throw new Error("Starter creation references a different package revision.");
|
|
450
607
|
if (!resolved.starter.supportedMethods.includes(request.method)) throw new Error("The selected training method is not supported by this starter.");
|
|
451
608
|
return { request, resolved };
|
|
452
609
|
}
|
|
@@ -460,7 +617,7 @@ function previewModelStarter(value) {
|
|
|
460
617
|
name: rewardBinding.name,
|
|
461
618
|
description: rewardBinding.description,
|
|
462
619
|
checks: rewardBinding.sources.map((source) => {
|
|
463
|
-
const reward = rewards.find((reward2) =>
|
|
620
|
+
const reward = rewards.find((reward2) => sameLearningRef2(source.reward, learningRef3(reward2)));
|
|
464
621
|
return { name: reward.name, description: reward.description, kind: reward.implementation.kind, role: source.role, weight: source.weight, required: source.required, hardGate: source.hardGate };
|
|
465
622
|
})
|
|
466
623
|
},
|
|
@@ -487,12 +644,12 @@ function validateResolvedModelStarter(value) {
|
|
|
487
644
|
const resources = [starter, taskset, taskDefinition, rewardBinding, ...rewards, ...assets];
|
|
488
645
|
for (const resource of resources) {
|
|
489
646
|
const { contentHash, ...content } = resource;
|
|
490
|
-
if (
|
|
647
|
+
if (sealLearningContent4(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);
|
|
491
648
|
}
|
|
492
|
-
|
|
649
|
+
assertTasksetRelease2(taskset);
|
|
493
650
|
validateModelStarterExecution(resolved.execution, taskset, assets);
|
|
494
651
|
function exact(expected, resource) {
|
|
495
|
-
if (!
|
|
652
|
+
if (!sameLearningRef2(expected, learningRef3(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);
|
|
496
653
|
}
|
|
497
654
|
exact(starter.taskset, taskset);
|
|
498
655
|
exact(starter.taskDefinition, taskDefinition);
|
|
@@ -501,8 +658,8 @@ function validateResolvedModelStarter(value) {
|
|
|
501
658
|
if (rewardBinding.recipeRef) throw new Error("Starter binding recipes must be resolved into a standalone binding before publication.");
|
|
502
659
|
const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;
|
|
503
660
|
const execution = { policy, environment, ...environmentRelease ? { environmentRelease } : {}, tools, capabilities, ...verifierSetRelease ? { verifierSetRelease } : {} };
|
|
504
|
-
if (
|
|
505
|
-
if (
|
|
661
|
+
if (sealLearningContent4(execution).contentHash !== sealLearningContent4(taskDefinition.execution).contentHash) throw new Error("Starter execution context differs from its task format.");
|
|
662
|
+
if (sealLearningContent4({ graders: taskset.graders }).contentHash !== sealLearningContent4({ graders: compileBoundGraders2(rewardBinding, rewards) }).contentHash) throw new Error("Starter executable graders differ from its Reward binding.");
|
|
506
663
|
for (const [references, values] of [[starter.rewards, rewards], [starter.assets, assets]]) {
|
|
507
664
|
if (references.length !== values.length || new Set(values.map((resource) => resource.id)).size !== values.length) throw new Error("Starter dependency inventory mismatch.");
|
|
508
665
|
for (const ref of references) {
|
|
@@ -526,7 +683,7 @@ function validateResolvedModelStarter(value) {
|
|
|
526
683
|
];
|
|
527
684
|
for (const ref of references) {
|
|
528
685
|
const asset = assets.find((asset2) => asset2.id === ref.id);
|
|
529
|
-
if (!asset ||
|
|
686
|
+
if (!asset || sealLearningContent4(asset.asset).contentHash !== sealLearningContent4(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);
|
|
530
687
|
if (ref.visibility === "policy") throw new Error(`Starter Reward source must remain private to its evaluator: ${ref.id}.`);
|
|
531
688
|
}
|
|
532
689
|
}
|
|
@@ -534,12 +691,12 @@ function validateResolvedModelStarter(value) {
|
|
|
534
691
|
const inputSplits = /* @__PURE__ */ new Map();
|
|
535
692
|
for (const task of taskset.tasks) {
|
|
536
693
|
if (task.policyVisibleContext.instructions !== taskDefinition.instructions) throw new Error(`Starter task does not carry its declared model instructions: ${task.id}.`);
|
|
537
|
-
const inputHash =
|
|
694
|
+
const inputHash = sealLearningContent4({ input: task.input, context: task.policyVisibleContext }).contentHash;
|
|
538
695
|
const priorSplit = inputSplits.get(inputHash);
|
|
539
696
|
if (priorSplit && priorSplit !== task.split) throw new Error("Starter policy input appears in multiple splits.");
|
|
540
697
|
inputSplits.set(inputHash, task.split);
|
|
541
|
-
if (!
|
|
542
|
-
if (task.expectedOutput !== null && !
|
|
698
|
+
if (!validateTaskValue2(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);
|
|
699
|
+
if (task.expectedOutput !== null && !validateTaskValue2(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);
|
|
543
700
|
}
|
|
544
701
|
for (const id of starter.previewTaskIds) {
|
|
545
702
|
const task = taskset.tasks.find((task2) => task2.id === id);
|
|
@@ -556,15 +713,23 @@ export {
|
|
|
556
713
|
ModelStarterPrivacyReviewSchema,
|
|
557
714
|
ModelStarterSchema,
|
|
558
715
|
ModelStarterToolFixtureScriptSchema,
|
|
716
|
+
ModelTasksetDerivationSchema,
|
|
717
|
+
ModelTasksetExecutionResourcesSchema,
|
|
718
|
+
ModelTasksetPackageSchema,
|
|
559
719
|
ResolvedModelStarterSchema,
|
|
560
720
|
createModelStarterCreationRequest,
|
|
561
721
|
createModelStarterExecutionAsset,
|
|
722
|
+
createModelTasksetExecutionResourcesAsset,
|
|
723
|
+
deriveModelTaskset,
|
|
562
724
|
modelStarterExecutionAssetId,
|
|
563
725
|
modelStarterPrivacyContentHash,
|
|
726
|
+
modelTasksetExecutionResourcesAssetId,
|
|
564
727
|
parseModelStarterCreationRequest,
|
|
565
728
|
previewModelStarter,
|
|
566
729
|
resolveModelStarterExecutionAsset,
|
|
730
|
+
resolveModelTasksetExecutionResourcesAsset,
|
|
567
731
|
validateModelStarterCreation,
|
|
732
|
+
validateModelTasksetPackage,
|
|
568
733
|
validateResolvedModelStarter,
|
|
569
734
|
verifyModelStarterEnvironmentAttempt
|
|
570
735
|
};
|