openpond-sdk 0.1.14 → 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-starter-attempts.d.ts +10 -10
- package/dist/types/packages/sdk/src/model-starter-catalog.d.ts +8 -0
- package/dist/types/packages/sdk/src/model-starter-catalog.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-starter-execution.d.ts +2 -2
- package/dist/types/packages/sdk/src/model-starters.d.ts +22 -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 +2 -2
package/MODEL_STARTERS.md
CHANGED
|
@@ -37,6 +37,53 @@ Evidence references are nullable pointers to actual verifier, baseline, training
|
|
|
37
37
|
|
|
38
38
|
The repository's invoice-extraction example authors 80 original synthetic text tasks and executes its verifier fixtures. Its baseline, training, evaluation and full product qualification remain pending. The local server includes preparation, atomic persistence and file-materialization adapters; catalog publication, route wiring and Desktop Get Started integration are separate delivery steps.
|
|
39
39
|
|
|
40
|
+
## Model-owned Taskset revisions
|
|
41
|
+
|
|
42
|
+
`deriveModelTaskset` compiles a new immutable Taskset from an exact source package
|
|
43
|
+
and selected Reward binding. `ModelTasksetPackageSchema` and
|
|
44
|
+
`validateModelTasksetPackage` validate task formats, private assets, executable
|
|
45
|
+
graders, definition references and pinned execution resources. A package is
|
|
46
|
+
independent of its catalog listing.
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { deriveModelTaskset } from "openpond-sdk/model-starters";
|
|
50
|
+
|
|
51
|
+
const derived = deriveModelTaskset({
|
|
52
|
+
owner: { scopeId, modelId },
|
|
53
|
+
source,
|
|
54
|
+
rewardBinding: selectedBinding,
|
|
55
|
+
rewards: selectedRewards,
|
|
56
|
+
assets: resolvedPrivateAssets,
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The host must authorize the owner and source before compilation. The first edit
|
|
61
|
+
creates a distinct model-owned identity; later edits to that owner's Taskset
|
|
62
|
+
retain its identity and advance its revision. Another owner's edit forks a new
|
|
63
|
+
identity. `metadata.modelTasksetDerivation` retains exact root and parent refs.
|
|
64
|
+
The compiler rebuilds the grader snapshot, verifier set and task definition;
|
|
65
|
+
it preserves task rows and the environment. Changed packages have no inherited
|
|
66
|
+
calibration receipts, qualification results or publisher privacy attestation.
|
|
67
|
+
Authored fixtures can be retained for checking again.
|
|
68
|
+
|
|
69
|
+
The result includes `executionResources` for text and tool packages. Persist
|
|
70
|
+
`createModelTasksetExecutionResourcesAsset(derived.executionResources)` with the
|
|
71
|
+
derived package. On another host, load that private asset using
|
|
72
|
+
`modelTasksetExecutionResourcesAssetId(taskset)` and validate it with
|
|
73
|
+
`resolveModelTasksetExecutionResourcesAsset(taskset, asset)` before another edit.
|
|
74
|
+
This preserves the exact environment and verifier set for text packages too. Tool
|
|
75
|
+
packages also include the updated private JavaScript `execution` closure; persist
|
|
76
|
+
`createModelStarterExecutionAsset(derived.execution)` with the new definition.
|
|
77
|
+
The Taskset's binding and embedded Reward snapshot must agree. A model-level
|
|
78
|
+
selection cannot override the published grader snapshot at execution time.
|
|
79
|
+
|
|
80
|
+
Compilation changes no model or storage. The host must materialize immutable
|
|
81
|
+
files first, then atomically commit the Taskset, dependencies, intended model
|
|
82
|
+
attachment/configuration, compare-and-set revision and original operation
|
|
83
|
+
receipt. Keep preparation state across uncertain outcomes. A lost model CAS
|
|
84
|
+
may leave unattached package files; it must not retarget a model or overwrite an
|
|
85
|
+
earlier package. Reusing an operation returns its original committed result.
|
|
86
|
+
|
|
40
87
|
## Hosted starter attempts
|
|
41
88
|
|
|
42
89
|
The `openpond-sdk/model-starter-attempts` subpath defines a durable, workspace-scoped attempt API. Create requests select an attached Model Project, exact Taskset release, task, environment seed and explicit policy. They never carry replacement task input, private state, verifier source or evaluator context. Reuse the same `operationId` for a transport retry; use a new identity for a new evaluation.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/model-starter-catalog.ts
|
|
2
|
-
import { z as
|
|
2
|
+
import { z as z6 } from "zod";
|
|
3
3
|
|
|
4
4
|
// src/model-projects.ts
|
|
5
5
|
import { z } from "zod";
|
|
@@ -195,11 +195,11 @@ var ModelProjectApiErrorSchema = z.object({
|
|
|
195
195
|
}).strict();
|
|
196
196
|
|
|
197
197
|
// src/model-starters.ts
|
|
198
|
-
import { z as
|
|
199
|
-
import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
|
|
200
|
-
import { LearningTextAssetSchema, TaskDefinitionSchema, learningRef as
|
|
201
|
-
import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
|
|
202
|
-
import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue } from "@openpond/evals/task-schema";
|
|
198
|
+
import { z as z5 } from "zod";
|
|
199
|
+
import { TasksetReleaseSchema as TasksetReleaseSchema2, assertTasksetRelease as assertTasksetRelease2 } from "@openpond/evals/tasksets";
|
|
200
|
+
import { LearningTextAssetSchema as LearningTextAssetSchema2, TaskDefinitionSchema as TaskDefinitionSchema2, learningRef as learningRef3, sameLearningRef as sameLearningRef2, sealLearningContent as sealLearningContent4 } from "@openpond/evals/learning";
|
|
201
|
+
import { RewardBindingSchema as RewardBindingSchema2, RewardReleaseSchema as RewardReleaseSchema2, compileBoundGraders as compileBoundGraders2 } from "@openpond/evals/rewards";
|
|
202
|
+
import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue as validateTaskValue2 } from "@openpond/evals/task-schema";
|
|
203
203
|
|
|
204
204
|
// src/model-starter-execution.ts
|
|
205
205
|
import { z as z2 } from "zod";
|
|
@@ -270,29 +270,61 @@ function validateModelStarterExecution(execution, taskset, assets) {
|
|
|
270
270
|
}
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
+
// src/model-taskset-derivation.ts
|
|
274
|
+
import { z as z4 } from "zod";
|
|
275
|
+
import { createEnvironmentRelease, createVerifierSetRelease, verifyEnvironmentRelease as verifyEnvironmentRelease2, verifyVerifierSetRelease as verifyVerifierSetRelease2 } from "@openpond/evals";
|
|
276
|
+
import { LearningTextAssetSchema, TaskDefinitionSchema, assertLearningContentHash, learningRef as learningRef2, sameLearningRef, sealLearningContent as sealLearningContent3, verifyLearningTextAsset as verifyLearningTextAsset3 } from "@openpond/evals/learning";
|
|
277
|
+
import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
|
|
278
|
+
import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
|
|
279
|
+
import { validateTaskValue } from "@openpond/evals/task-schema";
|
|
280
|
+
|
|
281
|
+
// src/model-taskset-resources.ts
|
|
282
|
+
import { z as z3 } from "zod";
|
|
283
|
+
import { EnvironmentReleaseSchema as EnvironmentReleaseSchema2, VerifierSetReleaseSchema as VerifierSetReleaseSchema2, verifyEnvironmentRelease, verifyVerifierSetRelease } from "@openpond/evals";
|
|
284
|
+
import { createLearningTextAsset as createLearningTextAsset2, sealLearningContent as sealLearningContent2, verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals/learning";
|
|
285
|
+
var ModelTasksetExecutionResourcesSchema = z3.object({ environment: EnvironmentReleaseSchema2, verifierSet: VerifierSetReleaseSchema2 }).strict();
|
|
286
|
+
|
|
287
|
+
// src/model-taskset-derivation.ts
|
|
288
|
+
var OwnerSchema = z4.object({ scopeId: z4.string().trim().min(1).max(500), modelId: z4.string().trim().min(1).max(500) }).strict();
|
|
289
|
+
var ModelTasksetDerivationSchema = z4.object({
|
|
290
|
+
schemaVersion: z4.literal("openpond.modelTasksetDerivation.v1"),
|
|
291
|
+
owner: OwnerSchema,
|
|
292
|
+
root: ModelProjectVersionedRefSchema,
|
|
293
|
+
parent: ModelProjectVersionedRefSchema
|
|
294
|
+
}).strict();
|
|
295
|
+
var ModelTasksetPackageSchema = z4.object({
|
|
296
|
+
taskset: TasksetReleaseSchema,
|
|
297
|
+
taskDefinition: TaskDefinitionSchema,
|
|
298
|
+
rewardBinding: RewardBindingSchema,
|
|
299
|
+
rewards: z4.array(RewardReleaseSchema).min(1).max(100),
|
|
300
|
+
assets: z4.array(LearningTextAssetSchema).max(1e3),
|
|
301
|
+
executionResources: ModelTasksetExecutionResourcesSchema.optional(),
|
|
302
|
+
execution: ModelStarterExecutionSchema.optional()
|
|
303
|
+
}).strict();
|
|
304
|
+
|
|
273
305
|
// src/model-starters.ts
|
|
274
|
-
var IdSchema2 =
|
|
306
|
+
var IdSchema2 = z5.string().trim().min(1).max(500);
|
|
275
307
|
var RefSchema = ModelProjectVersionedRefSchema;
|
|
276
|
-
var ModelStarterContentSchema =
|
|
277
|
-
schemaVersion:
|
|
308
|
+
var ModelStarterContentSchema = z5.object({
|
|
309
|
+
schemaVersion: z5.literal("openpond.modelStarter.v1"),
|
|
278
310
|
id: IdSchema2,
|
|
279
|
-
revision:
|
|
280
|
-
name:
|
|
281
|
-
description:
|
|
282
|
-
category:
|
|
311
|
+
revision: z5.number().int().positive(),
|
|
312
|
+
name: z5.string().trim().min(1).max(200),
|
|
313
|
+
description: z5.string().trim().min(1).max(2e3),
|
|
314
|
+
category: z5.enum(["extraction", "support", "operations", "knowledge", "coding", "writing", "classification"]),
|
|
283
315
|
taskset: RefSchema,
|
|
284
316
|
taskDefinition: RefSchema,
|
|
285
317
|
rewardBinding: RefSchema,
|
|
286
|
-
rewards:
|
|
287
|
-
assets:
|
|
288
|
-
previewTaskIds:
|
|
318
|
+
rewards: z5.array(RefSchema).min(1).max(100),
|
|
319
|
+
assets: z5.array(RefSchema).max(1e3),
|
|
320
|
+
previewTaskIds: z5.array(IdSchema2).min(1).max(8),
|
|
289
321
|
startingModel: ModelProjectBaseModelSchema,
|
|
290
|
-
supportedMethods:
|
|
322
|
+
supportedMethods: z5.array(ModelProjectTrainingMethodSchema).min(1).max(8),
|
|
291
323
|
defaultMethod: ModelProjectTrainingMethodSchema,
|
|
292
|
-
provenance:
|
|
324
|
+
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(),
|
|
293
325
|
// These are references to real results. Package publication does not create
|
|
294
326
|
// evidence, qualify a starter, or enable continuous learning.
|
|
295
|
-
evidence:
|
|
327
|
+
evidence: z5.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict()
|
|
296
328
|
}).strict().superRefine((starter, context) => {
|
|
297
329
|
if (!starter.supportedMethods.includes(starter.defaultMethod)) context.addIssue({ code: "custom", path: ["defaultMethod"], message: "The default method must be supported by the package." });
|
|
298
330
|
for (const field of ["rewards", "assets"]) {
|
|
@@ -300,23 +332,23 @@ var ModelStarterContentSchema = z3.object({
|
|
|
300
332
|
}
|
|
301
333
|
if (new Set(starter.previewTaskIds).size !== starter.previewTaskIds.length) context.addIssue({ code: "custom", path: ["previewTaskIds"], message: "Preview tasks must be unique." });
|
|
302
334
|
});
|
|
303
|
-
var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash:
|
|
304
|
-
var ResolvedModelStarterSchema =
|
|
335
|
+
var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z5.string().regex(/^[a-f0-9]{64}$/) });
|
|
336
|
+
var ResolvedModelStarterSchema = z5.object({
|
|
305
337
|
starter: ModelStarterSchema,
|
|
306
|
-
taskset:
|
|
307
|
-
taskDefinition:
|
|
308
|
-
rewardBinding:
|
|
309
|
-
rewards:
|
|
310
|
-
assets:
|
|
338
|
+
taskset: TasksetReleaseSchema2,
|
|
339
|
+
taskDefinition: TaskDefinitionSchema2,
|
|
340
|
+
rewardBinding: RewardBindingSchema2,
|
|
341
|
+
rewards: z5.array(RewardReleaseSchema2).min(1).max(100),
|
|
342
|
+
assets: z5.array(LearningTextAssetSchema2).max(1e3),
|
|
311
343
|
execution: ModelStarterExecutionSchema.optional()
|
|
312
344
|
}).strict();
|
|
313
|
-
var ModelStarterPrivacyReviewSchema =
|
|
314
|
-
schemaVersion:
|
|
315
|
-
disposition:
|
|
316
|
-
reviewedBy:
|
|
317
|
-
reviewedAt:
|
|
318
|
-
reviewedContentHash:
|
|
319
|
-
note:
|
|
345
|
+
var ModelStarterPrivacyReviewSchema = z5.object({
|
|
346
|
+
schemaVersion: z5.literal("openpond.modelStarterPrivacyReview.v1"),
|
|
347
|
+
disposition: z5.literal("synthetic_only"),
|
|
348
|
+
reviewedBy: z5.string().trim().min(1).max(500),
|
|
349
|
+
reviewedAt: z5.iso.datetime(),
|
|
350
|
+
reviewedContentHash: z5.string().regex(/^[a-f0-9]{64}$/),
|
|
351
|
+
note: z5.string().trim().min(1).max(2e3)
|
|
320
352
|
}).strict();
|
|
321
353
|
function modelStarterPrivacyContentHash(value) {
|
|
322
354
|
const { contentHash: _starterHash, ...starter } = value.starter;
|
|
@@ -328,19 +360,19 @@ function modelStarterPrivacyContentHash(value) {
|
|
|
328
360
|
const { privacyReview: _review, ...content } = authoring;
|
|
329
361
|
metadata.starterAuthoring = content;
|
|
330
362
|
}
|
|
331
|
-
return
|
|
363
|
+
return sealLearningContent4({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;
|
|
332
364
|
}
|
|
333
|
-
var ModelStarterCreationIntentSchema =
|
|
365
|
+
var ModelStarterCreationIntentSchema = z5.object({
|
|
334
366
|
profileId: IdSchema2,
|
|
335
367
|
modelId: IdSchema2,
|
|
336
|
-
name:
|
|
368
|
+
name: z5.string().trim().min(1).max(200),
|
|
337
369
|
starter: RefSchema,
|
|
338
370
|
startingModel: ModelProjectBaseModelSchema,
|
|
339
371
|
method: ModelProjectTrainingMethodSchema,
|
|
340
372
|
rewardBindingRef: RefSchema.nullable().optional()
|
|
341
373
|
}).strict();
|
|
342
374
|
var ModelStarterCreationRequestSchema = ModelStarterCreationIntentSchema.extend({
|
|
343
|
-
schemaVersion:
|
|
375
|
+
schemaVersion: z5.literal("openpond.modelStarterCreation.v1"),
|
|
344
376
|
operationId: IdSchema2
|
|
345
377
|
}).strict();
|
|
346
378
|
function validateResolvedModelStarter(value) {
|
|
@@ -355,12 +387,12 @@ function validateResolvedModelStarter(value) {
|
|
|
355
387
|
const resources = [starter, taskset, taskDefinition, rewardBinding, ...rewards, ...assets];
|
|
356
388
|
for (const resource of resources) {
|
|
357
389
|
const { contentHash, ...content } = resource;
|
|
358
|
-
if (
|
|
390
|
+
if (sealLearningContent4(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);
|
|
359
391
|
}
|
|
360
|
-
|
|
392
|
+
assertTasksetRelease2(taskset);
|
|
361
393
|
validateModelStarterExecution(resolved.execution, taskset, assets);
|
|
362
394
|
function exact(expected, resource) {
|
|
363
|
-
if (!
|
|
395
|
+
if (!sameLearningRef2(expected, learningRef3(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);
|
|
364
396
|
}
|
|
365
397
|
exact(starter.taskset, taskset);
|
|
366
398
|
exact(starter.taskDefinition, taskDefinition);
|
|
@@ -369,8 +401,8 @@ function validateResolvedModelStarter(value) {
|
|
|
369
401
|
if (rewardBinding.recipeRef) throw new Error("Starter binding recipes must be resolved into a standalone binding before publication.");
|
|
370
402
|
const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;
|
|
371
403
|
const execution = { policy, environment, ...environmentRelease ? { environmentRelease } : {}, tools, capabilities, ...verifierSetRelease ? { verifierSetRelease } : {} };
|
|
372
|
-
if (
|
|
373
|
-
if (
|
|
404
|
+
if (sealLearningContent4(execution).contentHash !== sealLearningContent4(taskDefinition.execution).contentHash) throw new Error("Starter execution context differs from its task format.");
|
|
405
|
+
if (sealLearningContent4({ graders: taskset.graders }).contentHash !== sealLearningContent4({ graders: compileBoundGraders2(rewardBinding, rewards) }).contentHash) throw new Error("Starter executable graders differ from its Reward binding.");
|
|
374
406
|
for (const [references, values] of [[starter.rewards, rewards], [starter.assets, assets]]) {
|
|
375
407
|
if (references.length !== values.length || new Set(values.map((resource) => resource.id)).size !== values.length) throw new Error("Starter dependency inventory mismatch.");
|
|
376
408
|
for (const ref of references) {
|
|
@@ -394,7 +426,7 @@ function validateResolvedModelStarter(value) {
|
|
|
394
426
|
];
|
|
395
427
|
for (const ref of references) {
|
|
396
428
|
const asset = assets.find((asset2) => asset2.id === ref.id);
|
|
397
|
-
if (!asset ||
|
|
429
|
+
if (!asset || sealLearningContent4(asset.asset).contentHash !== sealLearningContent4(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);
|
|
398
430
|
if (ref.visibility === "policy") throw new Error(`Starter Reward source must remain private to its evaluator: ${ref.id}.`);
|
|
399
431
|
}
|
|
400
432
|
}
|
|
@@ -402,12 +434,12 @@ function validateResolvedModelStarter(value) {
|
|
|
402
434
|
const inputSplits = /* @__PURE__ */ new Map();
|
|
403
435
|
for (const task of taskset.tasks) {
|
|
404
436
|
if (task.policyVisibleContext.instructions !== taskDefinition.instructions) throw new Error(`Starter task does not carry its declared model instructions: ${task.id}.`);
|
|
405
|
-
const inputHash =
|
|
437
|
+
const inputHash = sealLearningContent4({ input: task.input, context: task.policyVisibleContext }).contentHash;
|
|
406
438
|
const priorSplit = inputSplits.get(inputHash);
|
|
407
439
|
if (priorSplit && priorSplit !== task.split) throw new Error("Starter policy input appears in multiple splits.");
|
|
408
440
|
inputSplits.set(inputHash, task.split);
|
|
409
|
-
if (!
|
|
410
|
-
if (task.expectedOutput !== null && !
|
|
441
|
+
if (!validateTaskValue2(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);
|
|
442
|
+
if (task.expectedOutput !== null && !validateTaskValue2(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);
|
|
411
443
|
}
|
|
412
444
|
for (const id of starter.previewTaskIds) {
|
|
413
445
|
const task = taskset.tasks.find((task2) => task2.id === id);
|
|
@@ -417,18 +449,18 @@ function validateResolvedModelStarter(value) {
|
|
|
417
449
|
}
|
|
418
450
|
|
|
419
451
|
// src/model-starter-catalog.ts
|
|
420
|
-
var ModelStarterCatalogQuerySchema =
|
|
421
|
-
afterId:
|
|
422
|
-
limit:
|
|
452
|
+
var ModelStarterCatalogQuerySchema = z6.object({
|
|
453
|
+
afterId: z6.string().trim().min(1).max(500).optional(),
|
|
454
|
+
limit: z6.number().int().min(1).max(100).default(30)
|
|
423
455
|
}).strict();
|
|
424
456
|
var ModelStarterCatalogItemSchema = ModelStarterSchema.extend({
|
|
425
|
-
rewardSummary:
|
|
457
|
+
rewardSummary: z6.array(z6.object({ name: z6.string().min(1).max(500), kind: z6.enum(["custom_verifier", "model_judge", "human", "learned_model", "content", "schema", "artifact", "runtime_event", "state"]) }).strict()).max(100).optional()
|
|
426
458
|
});
|
|
427
|
-
var ModelStarterCatalogPageSchema =
|
|
428
|
-
items:
|
|
429
|
-
nextCursor:
|
|
459
|
+
var ModelStarterCatalogPageSchema = z6.object({
|
|
460
|
+
items: z6.array(ModelStarterCatalogItemSchema).max(100),
|
|
461
|
+
nextCursor: z6.string().min(1).max(500).nullable()
|
|
430
462
|
}).strict();
|
|
431
|
-
var ModelStarterCatalogErrorSchema =
|
|
463
|
+
var ModelStarterCatalogErrorSchema = z6.object({ code: z6.string().min(1).max(200), message: z6.string().min(1).max(5e3) }).strict();
|
|
432
464
|
var OpenPondModelStarterCatalogError = class extends Error {
|
|
433
465
|
constructor(status, code, message) {
|
|
434
466
|
super(message);
|