openpond-sdk 0.12.9 → 0.12.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/TRAINING_PROTOCOL.md +40 -0
- package/dist/advanced-refiner-evaluations.js +8 -7
- package/dist/candidate-evaluations.js +7 -6
- package/dist/{chunk-TWJYL5YF.js → chunk-2LVR24GU.js} +5 -5
- package/dist/{chunk-MRUDFIB6.js → chunk-7BYLH47N.js} +6 -4
- package/dist/{chunk-MRUDFIB6.js.map → chunk-7BYLH47N.js.map} +1 -1
- package/dist/chunk-B3ZHJ2KK.js +152 -0
- package/dist/chunk-B3ZHJ2KK.js.map +1 -0
- package/dist/{chunk-D3WOJTUY.js → chunk-C3TS766N.js} +24 -87
- package/dist/chunk-C3TS766N.js.map +1 -0
- package/dist/{chunk-WYR3MZHU.js → chunk-C4W2MEFP.js} +2 -2
- package/dist/{chunk-GGG6H4MK.js → chunk-CNREFTAV.js} +2 -2
- package/dist/chunk-EZME7DV4.js +161 -0
- package/dist/chunk-EZME7DV4.js.map +1 -0
- package/dist/{chunk-IOZCYSJ6.js → chunk-GHPCQXG5.js} +2 -2
- package/dist/{chunk-EYMZQML2.js → chunk-GJRXJL6G.js} +525 -484
- package/dist/chunk-GJRXJL6G.js.map +1 -0
- package/dist/chunk-GX6KMHW2.js +108 -0
- package/dist/chunk-GX6KMHW2.js.map +1 -0
- package/dist/{chunk-BWFG46HX.js → chunk-HAQPGTQ4.js} +2 -2
- package/dist/{chunk-RFKZSSLB.js → chunk-IFBCLRBM.js} +5 -3
- package/dist/{chunk-RFKZSSLB.js.map → chunk-IFBCLRBM.js.map} +1 -1
- package/dist/chunk-IZ26ZCGU.js +65 -0
- package/dist/chunk-IZ26ZCGU.js.map +1 -0
- package/dist/{chunk-EEZ5YHJQ.js → chunk-JBYFD3QS.js} +3 -3
- package/dist/{chunk-U4QIGSP5.js → chunk-JDQVAG3R.js} +3 -3
- package/dist/{chunk-UWM2ZPGS.js → chunk-K54BDIKL.js} +3 -3
- package/dist/{chunk-QVLJFJBU.js → chunk-KOJC3TH4.js} +6 -6
- package/dist/{chunk-YP5DXGGC.js → chunk-LHHHJIDR.js} +2 -2
- package/dist/{chunk-UMK6DH75.js → chunk-NKF5NIML.js} +7 -5
- package/dist/{chunk-UMK6DH75.js.map → chunk-NKF5NIML.js.map} +1 -1
- package/dist/{chunk-LUFOAMN5.js → chunk-O3NOGKMT.js} +2 -2
- package/dist/{chunk-GZSQIOAH.js → chunk-ORYA2G7S.js} +6 -6
- package/dist/{chunk-XL44IXBO.js → chunk-RIN6Z56W.js} +5 -5
- package/dist/{chunk-CJDEVI3T.js → chunk-RLW4Y5ZV.js} +5 -3
- package/dist/{chunk-CJDEVI3T.js.map → chunk-RLW4Y5ZV.js.map} +1 -1
- package/dist/{chunk-QHCY4MBG.js → chunk-TLSP5JKG.js} +2 -2
- package/dist/chunk-U2KGUAIS.js +18 -0
- package/dist/chunk-U2KGUAIS.js.map +1 -0
- package/dist/{chunk-YSEYPMQ3.js → chunk-UOV2LEXS.js} +12 -154
- package/dist/chunk-UOV2LEXS.js.map +1 -0
- package/dist/{chunk-CZXN63A4.js → chunk-UWY5PUHR.js} +2 -2
- package/dist/{chunk-HYCHLMP7.js → chunk-XMVSQIK4.js} +2 -2
- package/dist/{chunk-TZREEZ4C.js → chunk-XRBM6PBD.js} +9 -9
- package/dist/{chunk-MGFI4226.js → chunk-YIGFQWZV.js} +3 -3
- package/dist/{chunk-EWRWGFKD.js → chunk-ZYDDHHZZ.js} +6 -4
- package/dist/{chunk-EWRWGFKD.js.map → chunk-ZYDDHHZZ.js.map} +1 -1
- package/dist/connected-evidence.js +18 -15
- package/dist/dataset-workspaces.js +21 -18
- package/dist/dataset-workspaces.js.map +1 -1
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/experiment-evaluation-schedules.js +22 -19
- package/dist/experiment-improvements.js +9 -8
- package/dist/experiments.js +22 -19
- package/dist/index.js +64 -58
- package/dist/index.js.map +1 -1
- package/dist/learning.js +9 -5
- package/dist/learning.js.map +1 -1
- package/dist/model-projects.js +6 -4
- package/dist/model-starter-attempts.js +3 -2
- package/dist/model-starter-catalog.js +13 -10
- package/dist/model-starter-catalog.js.map +1 -1
- package/dist/model-starters.js +13 -10
- package/dist/model-taskset-runs.js +5 -4
- package/dist/model-taskset-runs.js.map +1 -1
- package/dist/post-training.js +7 -6
- package/dist/taskset-drafts.js +17 -14
- package/dist/taskset-drafts.js.map +1 -1
- package/dist/taskset-packages.js +24 -21
- package/dist/tool-learning-local-store.js +355 -0
- package/dist/tool-learning-local-store.js.map +1 -0
- package/dist/tool-learning.js +414 -0
- package/dist/tool-learning.js.map +1 -0
- package/dist/training-bundle.js +31 -16
- package/dist/training-bundle.js.map +1 -1
- package/dist/training-hardware.js +23 -0
- package/dist/training-hardware.js.map +1 -0
- package/dist/training.js +31 -13
- package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +40 -40
- package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +20 -20
- package/dist/types/packages/sdk/src/errors.d.ts +3 -0
- package/dist/types/packages/sdk/src/errors.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
- package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
- package/dist/types/packages/sdk/src/experiment-run-details.d.ts +54 -54
- package/dist/types/packages/sdk/src/learning-client.d.ts +1 -6
- package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-error.d.ts +7 -0
- package/dist/types/packages/sdk/src/learning-error.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +2 -0
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-projects.d.ts +24 -0
- package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-starters.d.ts +6 -0
- package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/post-training.d.ts +58 -54
- package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +20 -20
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-client.d.ts +6 -0
- package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
- package/dist/types/packages/sdk/src/tool-learning-client.d.ts +1217 -0
- package/dist/types/packages/sdk/src/tool-learning-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts +140 -0
- package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/tool-learning.d.ts +4 -0
- package/dist/types/packages/sdk/src/tool-learning.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-compute-selection.d.ts +2 -0
- package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-estimates.d.ts +9 -1
- package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-hardware.d.ts +886 -0
- package/dist/types/packages/sdk/src/training-hardware.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
- package/dist/types/packages/sdk/src/training-preparations.d.ts +22 -0
- package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +2 -0
- package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-supervised.d.ts +101 -0
- package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-transport.d.ts +24 -0
- package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training.d.ts +34 -16
- package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
- package/package.json +18 -2
- package/dist/chunk-D3WOJTUY.js.map +0 -1
- package/dist/chunk-EYMZQML2.js.map +0 -1
- package/dist/chunk-YSEYPMQ3.js.map +0 -1
- /package/dist/{chunk-TWJYL5YF.js.map → chunk-2LVR24GU.js.map} +0 -0
- /package/dist/{chunk-WYR3MZHU.js.map → chunk-C4W2MEFP.js.map} +0 -0
- /package/dist/{chunk-GGG6H4MK.js.map → chunk-CNREFTAV.js.map} +0 -0
- /package/dist/{chunk-IOZCYSJ6.js.map → chunk-GHPCQXG5.js.map} +0 -0
- /package/dist/{chunk-BWFG46HX.js.map → chunk-HAQPGTQ4.js.map} +0 -0
- /package/dist/{chunk-EEZ5YHJQ.js.map → chunk-JBYFD3QS.js.map} +0 -0
- /package/dist/{chunk-U4QIGSP5.js.map → chunk-JDQVAG3R.js.map} +0 -0
- /package/dist/{chunk-UWM2ZPGS.js.map → chunk-K54BDIKL.js.map} +0 -0
- /package/dist/{chunk-QVLJFJBU.js.map → chunk-KOJC3TH4.js.map} +0 -0
- /package/dist/{chunk-YP5DXGGC.js.map → chunk-LHHHJIDR.js.map} +0 -0
- /package/dist/{chunk-LUFOAMN5.js.map → chunk-O3NOGKMT.js.map} +0 -0
- /package/dist/{chunk-GZSQIOAH.js.map → chunk-ORYA2G7S.js.map} +0 -0
- /package/dist/{chunk-XL44IXBO.js.map → chunk-RIN6Z56W.js.map} +0 -0
- /package/dist/{chunk-QHCY4MBG.js.map → chunk-TLSP5JKG.js.map} +0 -0
- /package/dist/{chunk-CZXN63A4.js.map → chunk-UWY5PUHR.js.map} +0 -0
- /package/dist/{chunk-HYCHLMP7.js.map → chunk-XMVSQIK4.js.map} +0 -0
- /package/dist/{chunk-TZREEZ4C.js.map → chunk-XRBM6PBD.js.map} +0 -0
- /package/dist/{chunk-MGFI4226.js.map → chunk-YIGFQWZV.js.map} +0 -0
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# `openpond-sdk`
|
|
2
2
|
|
|
3
|
+
See [tool learning](./TOOL_LEARNING.md) for scoped tool capture, private recovery evidence, and metered specialist consultation.
|
|
4
|
+
|
|
3
5
|
See [task evidence and learning](./LEARNING.md) for reusable Rewards, task-format publication, SDK/HTTP intake, grading, review and approved batches.
|
|
4
6
|
|
|
5
7
|
The OpenPond SDK is the server-side TypeScript client for running agentic work in OpenPond sandboxes. It gives Node.js applications, Next.js route handlers, workers, and backend services a small API for creating sandboxes, executing commands, managing files and runtimes, and running a model/tool loop in an isolated workspace.
|
package/TRAINING_PROTOCOL.md
CHANGED
|
@@ -288,3 +288,43 @@ CLI: `openpond training hosted-recover recovery.json --team-id <id> --home <conf
|
|
|
288
288
|
Managed Work reconciles a transient or lost policy HTTP response inside its current guest using the identical delivery, turn, seed, messages and tool body. The native gateway reads the existing command result for that identity; a response retry does not add a policy sample or replay already-executed Work tools. The signed native retry allowance is shared across the case and the original execution deadline remains binding. Successful Work timing evidence includes `policyHttpRetries`.
|
|
289
289
|
|
|
290
290
|
The native runner does not restart a whole stateful Work process to recover a policy HTTP failure. Exhausted retries, authentication/custody failures and first-call budget exhaustion still fail the attempt; no response, reward or optimizer update is fabricated. Other execution kinds keep their established process-retry behavior.
|
|
291
|
+
|
|
292
|
+
## Supervised recipes and reviewed targets
|
|
293
|
+
|
|
294
|
+
`SftRecipeSchema` and `ManagedSftRecipeSchema` from `openpond-sdk/training` describe
|
|
295
|
+
supervised LoRA updates with pinned model/tokenizer identity, completion-only
|
|
296
|
+
masking, dataset selection, epochs/steps, batch accumulation, and resource limits.
|
|
297
|
+
The workbench consumes the same recipe schema. SFT does not use GRPO rollout
|
|
298
|
+
counts, relative advantages, or reward-loss parameters. Initial managed SFT
|
|
299
|
+
requests require a fresh single-GPU run without cross-job continuation or
|
|
300
|
+
rollout-only qualification. A deterministic held-out grader remains evaluation
|
|
301
|
+
configuration; it is not the supervised optimizer objective.
|
|
302
|
+
|
|
303
|
+
`prepareManagedTrainingSubmission` requires a fully materialized approved recipe
|
|
304
|
+
and requests `managed_training.sft@1` for SFT. A deployed backend must explicitly
|
|
305
|
+
support that capability before accepting work; schema availability is not a claim
|
|
306
|
+
that a particular deployment or worker image has qualified SFT. Collection and
|
|
307
|
+
publication do not authorize optimizer execution. Approved targets, an independent
|
|
308
|
+
held-out population, funding, exact artifact custody, and execution permission
|
|
309
|
+
remain separate boundaries.
|
|
310
|
+
|
|
311
|
+
## Tool episode protocol
|
|
312
|
+
|
|
313
|
+
`openpond-sdk/tool-learning` re-exports the portable bounded episode, scoped
|
|
314
|
+
installation, manifest, and recovery-consultation schemas from
|
|
315
|
+
`@openpond/evals/tool-learning`. Integration and learned capability entries carry
|
|
316
|
+
different qualification receipts. A learned entry requires training, evaluation,
|
|
317
|
+
adapter, and activation references; newly captured errors cannot promote it.
|
|
318
|
+
Operational unavailability is distinct from a model's `proceed` response, and a
|
|
319
|
+
response must match the request's operation, installation, action, context,
|
|
320
|
+
manifest, capability, and model identity.
|
|
321
|
+
|
|
322
|
+
The separate `openpond-sdk/tool-learning/node` entry exports
|
|
323
|
+
`ToolLearningLocalStore`, a private bounded SQLite queue for an explicitly selected
|
|
324
|
+
OpenPond home. It records installation scope and capture policy, rejects conflicting
|
|
325
|
+
event identities, bounds pending evidence, records dropped/expired counts, and
|
|
326
|
+
removes queued events only for exact installation/event/content-hash acknowledgements.
|
|
327
|
+
It performs no authentication, network upload, tool execution, training, or model
|
|
328
|
+
activation. Callers must verify authentic durable hosted receipts before
|
|
329
|
+
acknowledging delivery. Import the portable entry in browser code; the Node queue
|
|
330
|
+
is a separate runtime capability.
|
|
@@ -12,17 +12,18 @@ import {
|
|
|
12
12
|
sealAdvancedRefinerEvaluationPin,
|
|
13
13
|
sealAdvancedRefinerReviewReceipt,
|
|
14
14
|
verifyAdvancedRefinerEvaluationPin
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-UWY5PUHR.js";
|
|
16
|
+
import "./chunk-O3NOGKMT.js";
|
|
17
17
|
import "./chunk-3B5KSH3V.js";
|
|
18
18
|
import "./chunk-H3367ISL.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-LHHHJIDR.js";
|
|
20
20
|
import "./chunk-O6FKHAWN.js";
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-C4W2MEFP.js";
|
|
22
|
+
import "./chunk-ZYDDHHZZ.js";
|
|
23
|
+
import "./chunk-RLW4Y5ZV.js";
|
|
24
|
+
import "./chunk-UOV2LEXS.js";
|
|
25
25
|
import "./chunk-CL3IOOVL.js";
|
|
26
|
+
import "./chunk-B3ZHJ2KK.js";
|
|
26
27
|
import "./chunk-H3JZ3P5T.js";
|
|
27
28
|
import "./chunk-YLJ4XMA6.js";
|
|
28
29
|
export {
|
|
@@ -5,13 +5,14 @@ import {
|
|
|
5
5
|
CandidateEvaluationPreparationSchema,
|
|
6
6
|
CandidateEvaluationRequestSchema,
|
|
7
7
|
createCandidateEvaluationClient
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-CNREFTAV.js";
|
|
9
|
+
import "./chunk-K54BDIKL.js";
|
|
10
|
+
import "./chunk-C4W2MEFP.js";
|
|
11
|
+
import "./chunk-ZYDDHHZZ.js";
|
|
12
|
+
import "./chunk-RLW4Y5ZV.js";
|
|
13
|
+
import "./chunk-UOV2LEXS.js";
|
|
14
14
|
import "./chunk-CL3IOOVL.js";
|
|
15
|
+
import "./chunk-B3ZHJ2KK.js";
|
|
15
16
|
import "./chunk-H3JZ3P5T.js";
|
|
16
17
|
import "./chunk-YLJ4XMA6.js";
|
|
17
18
|
export {
|
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
ExperimentImprovementTestRecipeSchema,
|
|
7
7
|
verifyExperimentImprovementHumanOptions,
|
|
8
8
|
verifyExperimentImprovementState
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-O3NOGKMT.js";
|
|
10
|
+
import {
|
|
11
|
+
fetchConnectedJson
|
|
12
|
+
} from "./chunk-O6FKHAWN.js";
|
|
10
13
|
import {
|
|
11
14
|
HarnessPolicySourcePackageSchema,
|
|
12
15
|
validateHarnessPolicySourcePackage
|
|
13
16
|
} from "./chunk-Q4TKI2MV.js";
|
|
14
|
-
import {
|
|
15
|
-
fetchConnectedJson
|
|
16
|
-
} from "./chunk-O6FKHAWN.js";
|
|
17
17
|
import {
|
|
18
18
|
ImmutableReleaseRefSchema,
|
|
19
19
|
contentHash,
|
|
@@ -157,4 +157,4 @@ export {
|
|
|
157
157
|
HostedProfileCandidateCommandSchema,
|
|
158
158
|
ExperimentImprovementClient
|
|
159
159
|
};
|
|
160
|
-
//# sourceMappingURL=chunk-
|
|
160
|
+
//# sourceMappingURL=chunk-2LVR24GU.js.map
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RunExperimentSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-K54BDIKL.js";
|
|
4
|
+
import {
|
|
5
|
+
HostedModelProjectSummarySchema
|
|
6
|
+
} from "./chunk-UOV2LEXS.js";
|
|
4
7
|
import {
|
|
5
|
-
HostedModelProjectSummarySchema,
|
|
6
8
|
OpenPondProtocolError,
|
|
7
9
|
canonicalSha256
|
|
8
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-B3ZHJ2KK.js";
|
|
9
11
|
import {
|
|
10
12
|
contentHash
|
|
11
13
|
} from "./chunk-H3JZ3P5T.js";
|
|
@@ -293,4 +295,4 @@ export {
|
|
|
293
295
|
HostedTrainingPolicyControlSchema,
|
|
294
296
|
TrainingHandoffOriginSchema2 as TrainingHandoffOriginSchema
|
|
295
297
|
};
|
|
296
|
-
//# sourceMappingURL=chunk-
|
|
298
|
+
//# sourceMappingURL=chunk-7BYLH47N.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/post-training.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { contentHash } from \"@openpond/harness\";\nimport {\n LearningSourceSchema,\n TaskBatchSchema,\n TaskDefinitionSchema,\n LearningPolicySchema,\n LearningPolicyInspectionResultSchema,\n LearningIterationSchema,\n} from \"@openpond/evals/learning\";\nimport { HostedModelProjectSummarySchema } from \"./model-projects.js\";\nimport { AcceptancePlanSchema } from \"@openpond/evals/learning\";\nimport { TrainingHandoffOriginSchema } from \"@openpond/evals/learning\";\nexport { TrainingHandoffOriginSchema, type TrainingHandoffOrigin } from \"@openpond/evals/learning\";\nimport { RunExperimentSchema } from \"./experiment-run-contracts.js\";\nimport { canonicalSha256, OpenPondProtocolError } from \"./protocol.js\";\n\nconst Id = z.string().trim().min(1).max(200);\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\nconst Ref = z.object({ id: Id, contentHash: Hash }).strict();\nexport const TrainingHandoffContextSchema = z\n .object({\n available: z.boolean(),\n reason: z.string().max(1000).nullable(),\n origin: TrainingHandoffOriginSchema.nullable(),\n })\n .strict();\nexport type TrainingHandoffContext = z.infer<typeof TrainingHandoffContextSchema>;\nexport const PostTrainingAttachmentSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.postTrainingAttachment.v1\"),\n binding: z\n .object({\n kind: z.enum([\"preparation\", \"policy\"]),\n id: Id,\n revision: z.number().int().positive(),\n contentHash: Hash,\n })\n .strict(),\n projectId: Id.nullable(),\n automatic: z.boolean(),\n maximumSpendUsd: z.number().finite().positive().max(10_000),\n experiments: z\n .array(z.object({ id: Id, configuration: RunExperimentSchema }).strict())\n .min(1)\n .max(20),\n acceptancePlan: AcceptancePlanSchema.nullable(),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (new Set(value.experiments.map((item) => item.id)).size !== value.experiments.length)\n ctx.addIssue({ code: \"custom\", message: \"Attach each evaluation once.\" });\n if (\n value.experiments.reduce((sum, item) => sum + item.configuration.maximumCostUsd, 0) >\n value.maximumSpendUsd + 1e-9\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Attached evaluation budgets exceed the total approved budget.\",\n });\n if (\n value.experiments.some(\n (item) => (item.configuration.request.project?.id ?? null) !== value.projectId,\n )\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Attached experiments must use the training Project.\",\n });\n if (value.acceptancePlan) {\n const checked = new Set(value.acceptancePlan.checks.map((c) => c.id));\n if (value.acceptancePlan.checks.some((c) => !value.experiments.some((m) => m.id === c.id)))\n ctx.addIssue({\n code: \"custom\",\n message: \"Select the frozen Experiment for each acceptance check.\",\n });\n const committed =\n value.acceptancePlan.maximumSpendUsd +\n value.experiments\n .filter((m) => !checked.has(m.id))\n .reduce((sum, m) => sum + m.configuration.maximumCostUsd, 0);\n if (committed > value.maximumSpendUsd + 1e-9)\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Paired acceptance and diagnostic ceilings exceed the approved evaluation budget.\",\n });\n }\n });\nexport type PostTrainingAttachment = z.infer<typeof PostTrainingAttachmentSchema>;\n/** Target-independent recipe pins keep the paired baseline/candidate check on\n * the same released data, case order, settings and graders. */\nexport function postTrainingRecipe(\n configuration: PostTrainingAttachment[\"experiments\"][number][\"configuration\"],\n) {\n const {\n modelId: _model,\n candidate: _candidate,\n ...settings\n } = configuration.request.policy.kind === \"fixture\"\n ? { modelId: null, candidate: null, ...configuration.request.policy }\n : configuration.request.policy;\n void _model;\n void _candidate;\n if (\"modelConfigurationHash\" in settings)\n delete (settings as { modelConfigurationHash?: string }).modelConfigurationHash;\n return {\n dataset: {\n id: configuration.request.taskset.id,\n contentHash: configuration.request.taskset.contentHash,\n },\n populationHash: contentHash(\n configuration.request.population.map((m) => ({\n caseId: m.taskId,\n seed: m.seed,\n fixtureId: m.fixtureId,\n })),\n ),\n executionHash: contentHash({ settings, graders: configuration.graders ?? null }),\n };\n}\nexport const PostTrainingQualificationSchema = z\n .object({\n baseline: Ref,\n checks: z\n .array(\n z\n .object({\n id: Id,\n sourceRunId: Id,\n sourceManifestHash: Hash,\n targetConfigurationHash: Hash,\n executionHash: Hash,\n populationHash: Hash,\n evaluator: Ref,\n feedbackKey: Id,\n output: z.enum([\"boolean\", \"score\"]),\n unit: z.string().min(1).max(80),\n })\n .strict(),\n )\n .min(1)\n .max(100),\n })\n .strict();\nexport const PostTrainingStateSchema = z.enum([\n \"waiting_for_training\",\n \"ready\",\n \"preparing\",\n \"queued\",\n \"running\",\n \"cleaning\",\n \"completed\",\n \"failed\",\n \"blocked\",\n \"cancelled\",\n \"budget_exhausted\",\n]);\nexport const PostTrainingSummarySchema = z\n .object({\n schemaVersion: z.literal(\"openpond.postTrainingSummary.v1\"),\n id: Id,\n teamId: Id,\n jobId: Id,\n revision: z.number().int().positive(),\n planHash: Hash,\n automatic: z.boolean(),\n candidate: Ref.nullable(),\n state: PostTrainingStateSchema,\n total: z.number().int().positive(),\n completed: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(),\n requiredOutcome: z.enum([\"none\", \"pending\", \"passed\", \"failed\", \"blocked\"]),\n reason: z.string().max(500).nullable(),\n groupId: Id.nullable(),\n experimentIds: z.array(Id).max(20),\n updatedAt: z.iso.datetime(),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (value.completed + value.failed > value.total)\n ctx.addIssue({ code: \"custom\", message: \"Evaluation totals are inconsistent.\" });\n if (\n [\"preparing\", \"queued\", \"running\", \"cleaning\", \"completed\"].includes(value.state) &&\n !value.candidate\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Evaluation execution requires the exact trained candidate.\",\n });\n });\nexport type PostTrainingSummary = z.infer<typeof PostTrainingSummarySchema>;\nexport const PostTrainingControlSchema = z\n .object({ operationId: Id, expectedRevision: z.number().int().positive(), planHash: Hash })\n .strict();\nexport const AttachPostTrainingSchema = z\n .object({ operationId: Id, attachment: PostTrainingAttachmentSchema })\n .strict();\nexport const PostTrainingPlanSchema = z\n .object({\n id: Id,\n teamId: Id,\n ownerUserId: Id,\n attachment: PostTrainingAttachmentSchema,\n qualification: PostTrainingQualificationSchema.nullable(),\n contentHash: Hash,\n createdAt: z.iso.datetime(),\n })\n .strict();\nexport type PostTrainingPlan = z.infer<typeof PostTrainingPlanSchema>;\nexport function verifyPostTrainingPlan(raw: unknown): PostTrainingPlan {\n const plan = PostTrainingPlanSchema.parse(raw);\n if (\n plan.contentHash !==\n contentHash({ attachment: plan.attachment, qualification: plan.qualification })\n )\n throw new Error(\"The retained evaluation attachment or qualification changed.\");\n return plan;\n}\nexport function postTrainingActive(summary: PostTrainingSummary | null | undefined) {\n return Boolean(summary && [\"preparing\", \"queued\", \"running\", \"cleaning\"].includes(summary.state));\n}\n\n/** Read/setup are configuration-only. Manual start authorizes exactly the\n * retained candidate, plan and revision. A retry never launches training. */\nexport function createPostTrainingClient(input: {\n request: (path: string, init?: RequestInit) => Promise<unknown>;\n}) {\n const { request } = input;\n // These public evaluation routes consume ordinary JSON, independently of\n // the versioned Training V2 job routes used by the parent factory.\n const headers = { accept: \"application/json\", \"content-type\": \"application/json\" };\n const path = (jobId: string) =>\n `/v1/training/jobs/${encodeURIComponent(Id.parse(jobId))}/post-training`;\n async function read(raw: unknown, teamId: string, jobId: string) {\n if (raw === null) return null;\n const value = PostTrainingSummarySchema.parse(raw);\n if (value.teamId !== teamId || value.jobId !== jobId)\n throw new OpenPondProtocolError(\n \"post_training_scope_mismatch\",\n \"The evaluation summary belongs to another run or workspace.\",\n );\n return value;\n }\n return {\n async attach(teamId: string, raw: z.input<typeof AttachPostTrainingSchema>) {\n const body = AttachPostTrainingSchema.parse(raw);\n const value = verifyPostTrainingPlan(\n await request(\"/v1/training/post-training-plans\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n }),\n );\n if (\n value.teamId !== teamId ||\n (await canonicalSha256(value.attachment)) !== (await canonicalSha256(body.attachment))\n )\n throw new OpenPondProtocolError(\n \"post_training_plan_mismatch\",\n \"The retained attachment differs from the reviewed plan.\",\n );\n return value;\n },\n async get(teamId: string, jobId: string) {\n return read(await request(path(jobId), { headers }), teamId, jobId);\n },\n async control(\n teamId: string,\n jobId: string,\n action: \"start\" | \"retry\" | \"cancel\",\n raw: z.input<typeof PostTrainingControlSchema>,\n ) {\n const body = PostTrainingControlSchema.parse(raw);\n const value = await read(\n await request(`${path(jobId)}/${action}`, { method: \"POST\", headers, body: JSON.stringify(body) }),\n teamId,\n jobId,\n );\n if (!value || value.planHash !== body.planHash)\n throw new OpenPondProtocolError(\n \"post_training_control_mismatch\",\n \"Evaluation control did not retain the approved plan.\",\n );\n return value;\n },\n };\n}\n\nexport const HostedTrainingSetupCatalogSchema = z\n .object({\n teamId: Id,\n actorId: Id,\n projectId: Id.nullable(),\n configuration: HostedModelProjectSummarySchema,\n batches: z.array(TaskBatchSchema).max(10_000),\n sources: z.array(LearningSourceSchema).max(10_000),\n definitions: z.array(TaskDefinitionSchema).max(10_000),\n experiments: z\n .array(\n z\n .object({\n id: Id,\n name: z.string().max(500),\n configuration: RunExperimentSchema,\n graders: z\n .array(z.object({ feedbackKey: Id, name: z.string().max(500), ref: Ref }).strict())\n .max(100),\n })\n .strict(),\n )\n .max(10_000),\n })\n .strict();\nexport type HostedTrainingSetupCatalog = z.infer<typeof HostedTrainingSetupCatalogSchema>;\n\nexport const HostedTrainingSetupActionSchema = z.enum([\n \"prepare\",\n \"start\",\n \"cancel\",\n \"publish\",\n \"attach\",\n]);\nexport type HostedTrainingSetupAction = z.infer<typeof HostedTrainingSetupActionSchema>;\n\nexport const HostedTrainingPolicyDetailSchema = z\n .object({\n teamId: Id,\n actorId: Id,\n configuration: HostedModelProjectSummarySchema,\n policy: LearningPolicySchema,\n inspection: LearningPolicyInspectionResultSchema,\n iterations: z\n .array(\n z\n .object({\n iteration: LearningIterationSchema,\n evals: PostTrainingSummarySchema.nullable(),\n })\n .strict(),\n )\n .max(100),\n nextCursor: Id.nullable(),\n })\n .strict();\nexport const HostedTrainingPolicyControlSchema = z\n .object({\n id: Id,\n expectedRevision: z.number().int().positive(),\n policyHash: Hash,\n operationId: Id,\n action: z.enum([\"pause\", \"resume\", \"reserve\", \"cancel-iteration\", \"retry-iteration\"]),\n iterationId: Id.optional(),\n iterationRevision: z.number().int().positive().optional(),\n })\n .strict();\nexport type HostedTrainingPolicyControl = z.infer<typeof HostedTrainingPolicyControlSchema>;\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,4BAA4B;AACrC,SAAS,mCAAmC;AAC5C,SAAS,+BAAAA,oCAA+D;AAIxE,IAAM,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAC3C,IAAM,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB;AAC9C,IAAM,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,aAAa,KAAK,CAAC,EAAE,OAAO;AACpD,IAAM,+BAA+B,EACzC,OAAO;AAAA,EACN,WAAW,EAAE,QAAQ;AAAA,EACrB,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,EACtC,QAAQ,4BAA4B,SAAS;AAC/C,CAAC,EACA,OAAO;AAEH,IAAM,+BAA+B,EACzC,OAAO;AAAA,EACN,eAAe,EAAE,QAAQ,oCAAoC;AAAA,EAC7D,SAAS,EACN,OAAO;AAAA,IACN,MAAM,EAAE,KAAK,CAAC,eAAe,QAAQ,CAAC;AAAA,IACtC,IAAI;AAAA,IACJ,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACpC,aAAa;AAAA,EACf,CAAC,EACA,OAAO;AAAA,EACV,WAAW,GAAG,SAAS;AAAA,EACvB,WAAW,EAAE,QAAQ;AAAA,EACrB,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAM;AAAA,EAC1D,aAAa,EACV,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,eAAe,oBAAoB,CAAC,EAAE,OAAO,CAAC,EACvE,IAAI,CAAC,EACL,IAAI,EAAE;AAAA,EACT,gBAAgB,qBAAqB,SAAS;AAChD,CAAC,EACA,OAAO,EACP,YAAY,CAAC,OAAO,QAAQ;AAC3B,MAAI,IAAI,IAAI,MAAM,YAAY,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,EAAE,SAAS,MAAM,YAAY;AAC/E,QAAI,SAAS,EAAE,MAAM,UAAU,SAAS,+BAA+B,CAAC;AAC1E,MACE,MAAM,YAAY,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,cAAc,gBAAgB,CAAC,IAClF,MAAM,kBAAkB;AAExB,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACH,MACE,MAAM,YAAY;AAAA,IAChB,CAAC,UAAU,KAAK,cAAc,QAAQ,SAAS,MAAM,UAAU,MAAM;AAAA,EACvE;AAEA,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACH,MAAI,MAAM,gBAAgB;AACxB,UAAM,UAAU,IAAI,IAAI,MAAM,eAAe,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACpE,QAAI,MAAM,eAAe,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;AACvF,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACH,UAAM,YACJ,MAAM,eAAe,kBACrB,MAAM,YACH,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,EAChC,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,cAAc,gBAAgB,CAAC;AAC/D,QAAI,YAAY,MAAM,kBAAkB;AACtC,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,SACE;AAAA,MACJ,CAAC;AAAA,EACL;AACF,CAAC;AAII,SAAS,mBACd,eACA;AACA,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI,cAAc,QAAQ,OAAO,SAAS,YACtC,EAAE,SAAS,MAAM,WAAW,MAAM,GAAG,cAAc,QAAQ,OAAO,IAClE,cAAc,QAAQ;AAC1B,OAAK;AACL,OAAK;AACL,MAAI,4BAA4B;AAC9B,WAAQ,SAAiD;AAC3D,SAAO;AAAA,IACL,SAAS;AAAA,MACP,IAAI,cAAc,QAAQ,QAAQ;AAAA,MAClC,aAAa,cAAc,QAAQ,QAAQ;AAAA,IAC7C;AAAA,IACA,gBAAgB;AAAA,MACd,cAAc,QAAQ,WAAW,IAAI,CAAC,OAAO;AAAA,QAC3C,QAAQ,EAAE;AAAA,QACV,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,IACJ;AAAA,IACA,eAAe,YAAY,EAAE,UAAU,SAAS,cAAc,WAAW,KAAK,CAAC;AAAA,EACjF;AACF;AACO,IAAM,kCAAkC,EAC5C,OAAO;AAAA,EACN,UAAU;AAAA,EACV,QAAQ,EACL;AAAA,IACC,EACG,OAAO;AAAA,MACN,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,yBAAyB;AAAA,MACzB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,QAAQ,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC;AAAA,MACnC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,IAChC,CAAC,EACA,OAAO;AAAA,EACZ,EACC,IAAI,CAAC,EACL,IAAI,GAAG;AACZ,CAAC,EACA,OAAO;AACH,IAAM,0BAA0B,EAAE,KAAK;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,4BAA4B,EACtC,OAAO;AAAA,EACN,eAAe,EAAE,QAAQ,iCAAiC;AAAA,EAC1D,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpC,UAAU;AAAA,EACV,WAAW,EAAE,QAAQ;AAAA,EACrB,WAAW,IAAI,SAAS;AAAA,EACxB,OAAO;AAAA,EACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACxC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACrC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,WAAW,UAAU,UAAU,SAAS,CAAC;AAAA,EAC1E,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACrC,SAAS,GAAG,SAAS;AAAA,EACrB,eAAe,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE;AAAA,EACjC,WAAW,EAAE,IAAI,SAAS;AAC5B,CAAC,EACA,OAAO,EACP,YAAY,CAAC,OAAO,QAAQ;AAC3B,MAAI,MAAM,YAAY,MAAM,SAAS,MAAM;AACzC,QAAI,SAAS,EAAE,MAAM,UAAU,SAAS,sCAAsC,CAAC;AACjF,MACE,CAAC,aAAa,UAAU,WAAW,YAAY,WAAW,EAAE,SAAS,MAAM,KAAK,KAChF,CAAC,MAAM;AAEP,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACL,CAAC;AAEI,IAAM,4BAA4B,EACtC,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,UAAU,KAAK,CAAC,EACzF,OAAO;AACH,IAAM,2BAA2B,EACrC,OAAO,EAAE,aAAa,IAAI,YAAY,6BAA6B,CAAC,EACpE,OAAO;AACH,IAAM,yBAAyB,EACnC,OAAO;AAAA,EACN,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe,gCAAgC,SAAS;AAAA,EACxD,aAAa;AAAA,EACb,WAAW,EAAE,IAAI,SAAS;AAC5B,CAAC,EACA,OAAO;AAEH,SAAS,uBAAuB,KAAgC;AACrE,QAAM,OAAO,uBAAuB,MAAM,GAAG;AAC7C,MACE,KAAK,gBACL,YAAY,EAAE,YAAY,KAAK,YAAY,eAAe,KAAK,cAAc,CAAC;AAE9E,UAAM,IAAI,MAAM,8DAA8D;AAChF,SAAO;AACT;AACO,SAAS,mBAAmB,SAAiD;AAClF,SAAO,QAAQ,WAAW,CAAC,aAAa,UAAU,WAAW,UAAU,EAAE,SAAS,QAAQ,KAAK,CAAC;AAClG;AAIO,SAAS,yBAAyB,OAEtC;AACD,QAAM,EAAE,QAAQ,IAAI;AAGpB,QAAM,UAAU,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB;AACjF,QAAM,OAAO,CAAC,UACZ,qBAAqB,mBAAmB,GAAG,MAAM,KAAK,CAAC,CAAC;AAC1D,iBAAe,KAAK,KAAc,QAAgB,OAAe;AAC/D,QAAI,QAAQ,KAAM,QAAO;AACzB,UAAM,QAAQ,0BAA0B,MAAM,GAAG;AACjD,QAAI,MAAM,WAAW,UAAU,MAAM,UAAU;AAC7C,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,OAAO,QAAgB,KAA+C;AAC1E,YAAM,OAAO,yBAAyB,MAAM,GAAG;AAC/C,YAAM,QAAQ;AAAA,QACZ,MAAM,QAAQ,oCAAoC;AAAA,UAChD,QAAQ;AAAA,UACR;AAAA,UACA,MAAM,KAAK,UAAU,IAAI;AAAA,QAC3B,CAAC;AAAA,MACH;AACA,UACE,MAAM,WAAW,UAChB,MAAM,gBAAgB,MAAM,UAAU,MAAQ,MAAM,gBAAgB,KAAK,UAAU;AAEpF,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,aAAO;AAAA,IACT;AAAA,IACA,MAAM,IAAI,QAAgB,OAAe;AACvC,aAAO,KAAK,MAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,QAAQ,CAAC,GAAG,QAAQ,KAAK;AAAA,IACpE;AAAA,IACA,MAAM,QACJ,QACA,OACA,QACA,KACA;AACA,YAAM,OAAO,0BAA0B,MAAM,GAAG;AAChD,YAAM,QAAQ,MAAM;AAAA,QAClB,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,IAAI,MAAM,IAAI,EAAE,QAAQ,QAAQ,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,QACjG;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,SAAS,MAAM,aAAa,KAAK;AACpC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,mCAAmC,EAC7C,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW,GAAG,SAAS;AAAA,EACvB,eAAe;AAAA,EACf,SAAS,EAAE,MAAM,eAAe,EAAE,IAAI,GAAM;AAAA,EAC5C,SAAS,EAAE,MAAM,oBAAoB,EAAE,IAAI,GAAM;AAAA,EACjD,aAAa,EAAE,MAAM,oBAAoB,EAAE,IAAI,GAAM;AAAA,EACrD,aAAa,EACV;AAAA,IACC,EACG,OAAO;AAAA,MACN,IAAI;AAAA,MACJ,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,MACxB,eAAe;AAAA,MACf,SAAS,EACN,MAAM,EAAE,OAAO,EAAE,aAAa,IAAI,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,EAAE,OAAO,CAAC,EACjF,IAAI,GAAG;AAAA,IACZ,CAAC,EACA,OAAO;AAAA,EACZ,EACC,IAAI,GAAM;AACf,CAAC,EACA,OAAO;AAGH,IAAM,kCAAkC,EAAE,KAAK;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,mCAAmC,EAC7C,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY,EACT;AAAA,IACC,EACG,OAAO;AAAA,MACN,WAAW;AAAA,MACX,OAAO,0BAA0B,SAAS;AAAA,IAC5C,CAAC,EACA,OAAO;AAAA,EACZ,EACC,IAAI,GAAG;AAAA,EACV,YAAY,GAAG,SAAS;AAC1B,CAAC,EACA,OAAO;AACH,IAAM,oCAAoC,EAC9C,OAAO;AAAA,EACN,IAAI;AAAA,EACJ,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC5C,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ,EAAE,KAAK,CAAC,SAAS,UAAU,WAAW,oBAAoB,iBAAiB,CAAC;AAAA,EACpF,aAAa,GAAG,SAAS;AAAA,EACzB,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC1D,CAAC,EACA,OAAO;","names":["TrainingHandoffOriginSchema"]}
|
|
1
|
+
{"version":3,"sources":["../src/post-training.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { contentHash } from \"@openpond/harness\";\nimport {\n LearningSourceSchema,\n TaskBatchSchema,\n TaskDefinitionSchema,\n LearningPolicySchema,\n LearningPolicyInspectionResultSchema,\n LearningIterationSchema,\n} from \"@openpond/evals/learning\";\nimport { HostedModelProjectSummarySchema } from \"./model-projects.js\";\nimport { AcceptancePlanSchema } from \"@openpond/evals/learning\";\nimport { TrainingHandoffOriginSchema } from \"@openpond/evals/learning\";\nexport { TrainingHandoffOriginSchema, type TrainingHandoffOrigin } from \"@openpond/evals/learning\";\nimport { RunExperimentSchema } from \"./experiment-run-contracts.js\";\nimport { canonicalSha256, OpenPondProtocolError } from \"./protocol.js\";\n\nconst Id = z.string().trim().min(1).max(200);\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\nconst Ref = z.object({ id: Id, contentHash: Hash }).strict();\nexport const TrainingHandoffContextSchema = z\n .object({\n available: z.boolean(),\n reason: z.string().max(1000).nullable(),\n origin: TrainingHandoffOriginSchema.nullable(),\n })\n .strict();\nexport type TrainingHandoffContext = z.infer<typeof TrainingHandoffContextSchema>;\nexport const PostTrainingAttachmentSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.postTrainingAttachment.v1\"),\n binding: z\n .object({\n kind: z.enum([\"preparation\", \"policy\"]),\n id: Id,\n revision: z.number().int().positive(),\n contentHash: Hash,\n })\n .strict(),\n projectId: Id.nullable(),\n automatic: z.boolean(),\n maximumSpendUsd: z.number().finite().positive().max(10_000),\n experiments: z\n .array(z.object({ id: Id, configuration: RunExperimentSchema }).strict())\n .min(1)\n .max(20),\n acceptancePlan: AcceptancePlanSchema.nullable(),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (new Set(value.experiments.map((item) => item.id)).size !== value.experiments.length)\n ctx.addIssue({ code: \"custom\", message: \"Attach each evaluation once.\" });\n if (\n value.experiments.reduce((sum, item) => sum + item.configuration.maximumCostUsd, 0) >\n value.maximumSpendUsd + 1e-9\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Attached evaluation budgets exceed the total approved budget.\",\n });\n if (\n value.experiments.some(\n (item) => (item.configuration.request.project?.id ?? null) !== value.projectId,\n )\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Attached experiments must use the training Project.\",\n });\n if (value.acceptancePlan) {\n const checked = new Set(value.acceptancePlan.checks.map((c) => c.id));\n if (value.acceptancePlan.checks.some((c) => !value.experiments.some((m) => m.id === c.id)))\n ctx.addIssue({\n code: \"custom\",\n message: \"Select the frozen Experiment for each acceptance check.\",\n });\n const committed =\n value.acceptancePlan.maximumSpendUsd +\n value.experiments\n .filter((m) => !checked.has(m.id))\n .reduce((sum, m) => sum + m.configuration.maximumCostUsd, 0);\n if (committed > value.maximumSpendUsd + 1e-9)\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Paired acceptance and diagnostic ceilings exceed the approved evaluation budget.\",\n });\n }\n });\nexport type PostTrainingAttachment = z.infer<typeof PostTrainingAttachmentSchema>;\n/** Target-independent recipe pins keep the paired baseline/candidate check on\n * the same released data, case order, settings and graders. */\nexport function postTrainingRecipe(\n configuration: PostTrainingAttachment[\"experiments\"][number][\"configuration\"],\n) {\n const {\n modelId: _model,\n candidate: _candidate,\n ...settings\n } = configuration.request.policy.kind === \"fixture\"\n ? { modelId: null, candidate: null, ...configuration.request.policy }\n : configuration.request.policy;\n void _model;\n void _candidate;\n if (\"modelConfigurationHash\" in settings)\n delete (settings as { modelConfigurationHash?: string }).modelConfigurationHash;\n return {\n dataset: {\n id: configuration.request.taskset.id,\n contentHash: configuration.request.taskset.contentHash,\n },\n populationHash: contentHash(\n configuration.request.population.map((m) => ({\n caseId: m.taskId,\n seed: m.seed,\n fixtureId: m.fixtureId,\n })),\n ),\n executionHash: contentHash({ settings, graders: configuration.graders ?? null }),\n };\n}\nexport const PostTrainingQualificationSchema = z\n .object({\n baseline: Ref,\n checks: z\n .array(\n z\n .object({\n id: Id,\n sourceRunId: Id,\n sourceManifestHash: Hash,\n targetConfigurationHash: Hash,\n executionHash: Hash,\n populationHash: Hash,\n evaluator: Ref,\n feedbackKey: Id,\n output: z.enum([\"boolean\", \"score\"]),\n unit: z.string().min(1).max(80),\n })\n .strict(),\n )\n .min(1)\n .max(100),\n })\n .strict();\nexport const PostTrainingStateSchema = z.enum([\n \"waiting_for_training\",\n \"ready\",\n \"preparing\",\n \"queued\",\n \"running\",\n \"cleaning\",\n \"completed\",\n \"failed\",\n \"blocked\",\n \"cancelled\",\n \"budget_exhausted\",\n]);\nexport const PostTrainingSummarySchema = z\n .object({\n schemaVersion: z.literal(\"openpond.postTrainingSummary.v1\"),\n id: Id,\n teamId: Id,\n jobId: Id,\n revision: z.number().int().positive(),\n planHash: Hash,\n automatic: z.boolean(),\n candidate: Ref.nullable(),\n state: PostTrainingStateSchema,\n total: z.number().int().positive(),\n completed: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(),\n requiredOutcome: z.enum([\"none\", \"pending\", \"passed\", \"failed\", \"blocked\"]),\n reason: z.string().max(500).nullable(),\n groupId: Id.nullable(),\n experimentIds: z.array(Id).max(20),\n updatedAt: z.iso.datetime(),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (value.completed + value.failed > value.total)\n ctx.addIssue({ code: \"custom\", message: \"Evaluation totals are inconsistent.\" });\n if (\n [\"preparing\", \"queued\", \"running\", \"cleaning\", \"completed\"].includes(value.state) &&\n !value.candidate\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Evaluation execution requires the exact trained candidate.\",\n });\n });\nexport type PostTrainingSummary = z.infer<typeof PostTrainingSummarySchema>;\nexport const PostTrainingControlSchema = z\n .object({ operationId: Id, expectedRevision: z.number().int().positive(), planHash: Hash })\n .strict();\nexport const AttachPostTrainingSchema = z\n .object({ operationId: Id, attachment: PostTrainingAttachmentSchema })\n .strict();\nexport const PostTrainingPlanSchema = z\n .object({\n id: Id,\n teamId: Id,\n ownerUserId: Id,\n attachment: PostTrainingAttachmentSchema,\n qualification: PostTrainingQualificationSchema.nullable(),\n contentHash: Hash,\n createdAt: z.iso.datetime(),\n })\n .strict();\nexport type PostTrainingPlan = z.infer<typeof PostTrainingPlanSchema>;\nexport function verifyPostTrainingPlan(raw: unknown): PostTrainingPlan {\n const plan = PostTrainingPlanSchema.parse(raw);\n if (\n plan.contentHash !==\n contentHash({ attachment: plan.attachment, qualification: plan.qualification })\n )\n throw new Error(\"The retained evaluation attachment or qualification changed.\");\n return plan;\n}\nexport function postTrainingActive(summary: PostTrainingSummary | null | undefined) {\n return Boolean(summary && [\"preparing\", \"queued\", \"running\", \"cleaning\"].includes(summary.state));\n}\n\n/** Read/setup are configuration-only. Manual start authorizes exactly the\n * retained candidate, plan and revision. A retry never launches training. */\nexport function createPostTrainingClient(input: {\n request: (path: string, init?: RequestInit) => Promise<unknown>;\n}) {\n const { request } = input;\n // These public evaluation routes consume ordinary JSON, independently of\n // the versioned Training V2 job routes used by the parent factory.\n const headers = { accept: \"application/json\", \"content-type\": \"application/json\" };\n const path = (jobId: string) =>\n `/v1/training/jobs/${encodeURIComponent(Id.parse(jobId))}/post-training`;\n async function read(raw: unknown, teamId: string, jobId: string) {\n if (raw === null) return null;\n const value = PostTrainingSummarySchema.parse(raw);\n if (value.teamId !== teamId || value.jobId !== jobId)\n throw new OpenPondProtocolError(\n \"post_training_scope_mismatch\",\n \"The evaluation summary belongs to another run or workspace.\",\n );\n return value;\n }\n return {\n async attach(teamId: string, raw: z.input<typeof AttachPostTrainingSchema>) {\n const body = AttachPostTrainingSchema.parse(raw);\n const value = verifyPostTrainingPlan(\n await request(\"/v1/training/post-training-plans\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n }),\n );\n if (\n value.teamId !== teamId ||\n (await canonicalSha256(value.attachment)) !== (await canonicalSha256(body.attachment))\n )\n throw new OpenPondProtocolError(\n \"post_training_plan_mismatch\",\n \"The retained attachment differs from the reviewed plan.\",\n );\n return value;\n },\n async get(teamId: string, jobId: string) {\n return read(await request(path(jobId), { headers }), teamId, jobId);\n },\n async control(\n teamId: string,\n jobId: string,\n action: \"start\" | \"retry\" | \"cancel\",\n raw: z.input<typeof PostTrainingControlSchema>,\n ) {\n const body = PostTrainingControlSchema.parse(raw);\n const value = await read(\n await request(`${path(jobId)}/${action}`, { method: \"POST\", headers, body: JSON.stringify(body) }),\n teamId,\n jobId,\n );\n if (!value || value.planHash !== body.planHash)\n throw new OpenPondProtocolError(\n \"post_training_control_mismatch\",\n \"Evaluation control did not retain the approved plan.\",\n );\n return value;\n },\n };\n}\n\nexport const HostedTrainingSetupCatalogSchema = z\n .object({\n teamId: Id,\n actorId: Id,\n projectId: Id.nullable(),\n configuration: HostedModelProjectSummarySchema,\n batches: z.array(TaskBatchSchema).max(10_000),\n sources: z.array(LearningSourceSchema).max(10_000),\n definitions: z.array(TaskDefinitionSchema).max(10_000),\n experiments: z\n .array(\n z\n .object({\n id: Id,\n name: z.string().max(500),\n configuration: RunExperimentSchema,\n graders: z\n .array(z.object({ feedbackKey: Id, name: z.string().max(500), ref: Ref }).strict())\n .max(100),\n })\n .strict(),\n )\n .max(10_000),\n })\n .strict();\nexport type HostedTrainingSetupCatalog = z.infer<typeof HostedTrainingSetupCatalogSchema>;\n\nexport const HostedTrainingSetupActionSchema = z.enum([\n \"prepare\",\n \"start\",\n \"cancel\",\n \"publish\",\n \"attach\",\n]);\nexport type HostedTrainingSetupAction = z.infer<typeof HostedTrainingSetupActionSchema>;\n\nexport const HostedTrainingPolicyDetailSchema = z\n .object({\n teamId: Id,\n actorId: Id,\n configuration: HostedModelProjectSummarySchema,\n policy: LearningPolicySchema,\n inspection: LearningPolicyInspectionResultSchema,\n iterations: z\n .array(\n z\n .object({\n iteration: LearningIterationSchema,\n evals: PostTrainingSummarySchema.nullable(),\n })\n .strict(),\n )\n .max(100),\n nextCursor: Id.nullable(),\n })\n .strict();\nexport const HostedTrainingPolicyControlSchema = z\n .object({\n id: Id,\n expectedRevision: z.number().int().positive(),\n policyHash: Hash,\n operationId: Id,\n action: z.enum([\"pause\", \"resume\", \"reserve\", \"cancel-iteration\", \"retry-iteration\"]),\n iterationId: Id.optional(),\n iterationRevision: z.number().int().positive().optional(),\n })\n .strict();\nexport type HostedTrainingPolicyControl = z.infer<typeof HostedTrainingPolicyControlSchema>;\n"],"mappings":"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","names":["TrainingHandoffOriginSchema"]}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// src/protocol.ts
|
|
2
|
+
var OPENPOND_TRAINING_PROTOCOL_MAJOR = 2;
|
|
3
|
+
var OPENPOND_TRAINING_MEDIA_TYPE = "application/vnd.openpond.training+json;version=2";
|
|
4
|
+
var OPENPOND_MODEL_PROJECT_MEDIA_TYPE = "application/vnd.openpond.model-project+json;version=2";
|
|
5
|
+
var TRAINING_JOB_SUBMISSION_MAX_BYTES = 1048576;
|
|
6
|
+
var TRAINING_INPUT_ARTIFACT_MAX_BYTES = 67108864;
|
|
7
|
+
var TRAINING_API_RESPONSE_MAX_BYTES = 8388608;
|
|
8
|
+
var MODEL_PROJECT_SYNC_MAX_BYTES = 524288;
|
|
9
|
+
var MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8388608;
|
|
10
|
+
var OpenPondProtocolError = class extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code, message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "OpenPondProtocolError";
|
|
15
|
+
this.code = code;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
function canonicalJson(value) {
|
|
19
|
+
return JSON.stringify(normalizeCanonicalJson(value));
|
|
20
|
+
}
|
|
21
|
+
function canonicalJsonByteLength(value) {
|
|
22
|
+
return new TextEncoder().encode(canonicalJson(value)).byteLength;
|
|
23
|
+
}
|
|
24
|
+
async function canonicalSha256(value) {
|
|
25
|
+
const bytes = new TextEncoder().encode(canonicalJson(value));
|
|
26
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", bytes);
|
|
27
|
+
return Array.from(
|
|
28
|
+
new Uint8Array(digest),
|
|
29
|
+
(byte) => byte.toString(16).padStart(2, "0")
|
|
30
|
+
).join("");
|
|
31
|
+
}
|
|
32
|
+
function assertCanonicalPayloadSize(value, maximumBytes, label) {
|
|
33
|
+
const actualBytes = canonicalJsonByteLength(value);
|
|
34
|
+
if (actualBytes > maximumBytes) {
|
|
35
|
+
throw new OpenPondProtocolError(
|
|
36
|
+
"payload_too_large",
|
|
37
|
+
`${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function parseBoundedJson(text, maximumBytes, label) {
|
|
42
|
+
const actualBytes = new TextEncoder().encode(text).byteLength;
|
|
43
|
+
if (actualBytes > maximumBytes) {
|
|
44
|
+
throw new OpenPondProtocolError(
|
|
45
|
+
"response_too_large",
|
|
46
|
+
`${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
return JSON.parse(text);
|
|
51
|
+
} catch {
|
|
52
|
+
throw new OpenPondProtocolError(
|
|
53
|
+
"invalid_json",
|
|
54
|
+
`${label} was not valid JSON.`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function readBoundedJsonResponse(response, maximumBytes, label) {
|
|
59
|
+
const reader = response.body?.getReader();
|
|
60
|
+
if (!reader) return parseBoundedJson("", maximumBytes, label);
|
|
61
|
+
const decoder = new TextDecoder();
|
|
62
|
+
let bytes = 0;
|
|
63
|
+
let text = "";
|
|
64
|
+
try {
|
|
65
|
+
for (; ; ) {
|
|
66
|
+
const chunk = await reader.read();
|
|
67
|
+
if (chunk.done) break;
|
|
68
|
+
bytes += chunk.value.byteLength;
|
|
69
|
+
if (bytes > maximumBytes) {
|
|
70
|
+
throw new OpenPondProtocolError(
|
|
71
|
+
"response_too_large",
|
|
72
|
+
`${label} exceeds the maximum of ${maximumBytes} bytes.`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
text += decoder.decode(chunk.value, { stream: true });
|
|
76
|
+
}
|
|
77
|
+
text += decoder.decode();
|
|
78
|
+
return parseBoundedJson(text, maximumBytes, label);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
try {
|
|
81
|
+
await reader.cancel();
|
|
82
|
+
} catch {
|
|
83
|
+
}
|
|
84
|
+
throw error;
|
|
85
|
+
} finally {
|
|
86
|
+
try {
|
|
87
|
+
reader.releaseLock();
|
|
88
|
+
} catch {
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function normalizeCanonicalJson(value) {
|
|
93
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
if (typeof value === "number") {
|
|
97
|
+
if (!Number.isFinite(value)) {
|
|
98
|
+
throw new OpenPondProtocolError(
|
|
99
|
+
"non_json_value",
|
|
100
|
+
"Canonical JSON cannot contain a non-finite number."
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return Object.is(value, -0) ? 0 : value;
|
|
104
|
+
}
|
|
105
|
+
if (Array.isArray(value)) {
|
|
106
|
+
return value.map((entry) => normalizeCanonicalJson(entry));
|
|
107
|
+
}
|
|
108
|
+
if (typeof value === "object") {
|
|
109
|
+
const prototype = Object.getPrototypeOf(value);
|
|
110
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
111
|
+
throw new OpenPondProtocolError(
|
|
112
|
+
"non_json_value",
|
|
113
|
+
"Canonical JSON accepts only plain objects."
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
117
|
+
for (const key of Object.keys(value).sort()) {
|
|
118
|
+
const entry = value[key];
|
|
119
|
+
if (entry === void 0 || typeof entry === "function" || typeof entry === "symbol") {
|
|
120
|
+
throw new OpenPondProtocolError(
|
|
121
|
+
"non_json_value",
|
|
122
|
+
`Canonical JSON cannot contain ${typeof entry} at ${key}.`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
result[key] = normalizeCanonicalJson(entry);
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
throw new OpenPondProtocolError(
|
|
130
|
+
"non_json_value",
|
|
131
|
+
`Canonical JSON cannot contain ${typeof value}.`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export {
|
|
136
|
+
OPENPOND_TRAINING_PROTOCOL_MAJOR,
|
|
137
|
+
OPENPOND_TRAINING_MEDIA_TYPE,
|
|
138
|
+
OPENPOND_MODEL_PROJECT_MEDIA_TYPE,
|
|
139
|
+
TRAINING_JOB_SUBMISSION_MAX_BYTES,
|
|
140
|
+
TRAINING_INPUT_ARTIFACT_MAX_BYTES,
|
|
141
|
+
TRAINING_API_RESPONSE_MAX_BYTES,
|
|
142
|
+
MODEL_PROJECT_SYNC_MAX_BYTES,
|
|
143
|
+
MODEL_PROJECT_API_RESPONSE_MAX_BYTES,
|
|
144
|
+
OpenPondProtocolError,
|
|
145
|
+
canonicalJson,
|
|
146
|
+
canonicalJsonByteLength,
|
|
147
|
+
canonicalSha256,
|
|
148
|
+
assertCanonicalPayloadSize,
|
|
149
|
+
parseBoundedJson,
|
|
150
|
+
readBoundedJsonResponse
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=chunk-B3ZHJ2KK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/protocol.ts"],"sourcesContent":["export type CanonicalJsonValue =\n | null\n | boolean\n | number\n | string\n | CanonicalJsonValue[]\n | { [key: string]: CanonicalJsonValue };\n\nexport const OPENPOND_TRAINING_PROTOCOL_MAJOR = 2 as const;\nexport const OPENPOND_TRAINING_MEDIA_TYPE =\n \"application/vnd.openpond.training+json;version=2\" as const;\nexport const OPENPOND_MODEL_PROJECT_MEDIA_TYPE =\n \"application/vnd.openpond.model-project+json;version=2\" as const;\n\nexport const TRAINING_JOB_SUBMISSION_MAX_BYTES = 1_048_576;\nexport const TRAINING_INPUT_ARTIFACT_MAX_BYTES = 67_108_864;\nexport const TRAINING_API_RESPONSE_MAX_BYTES = 8_388_608;\nexport const MODEL_PROJECT_SYNC_MAX_BYTES = 524_288;\nexport const MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8_388_608;\n\nexport class OpenPondProtocolError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"OpenPondProtocolError\";\n this.code = code;\n }\n}\n\n/**\n * Deterministic JSON used for content-addressed OpenPond protocol objects.\n * Object keys are sorted by Unicode code point, arrays retain their authored\n * order, and non-JSON/non-finite values are rejected rather than coerced.\n */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(normalizeCanonicalJson(value));\n}\n\nexport function canonicalJsonByteLength(value: unknown): number {\n return new TextEncoder().encode(canonicalJson(value)).byteLength;\n}\n\nexport async function canonicalSha256(value: unknown): Promise<string> {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", bytes);\n return Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\nexport function assertCanonicalPayloadSize(\n value: unknown,\n maximumBytes: number,\n label: string,\n): void {\n const actualBytes = canonicalJsonByteLength(value);\n if (actualBytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"payload_too_large\",\n `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`,\n );\n }\n}\n\nexport function parseBoundedJson(\n text: string,\n maximumBytes: number,\n label: string,\n): unknown {\n const actualBytes = new TextEncoder().encode(text).byteLength;\n if (actualBytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"response_too_large\",\n `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`,\n );\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new OpenPondProtocolError(\n \"invalid_json\",\n `${label} was not valid JSON.`,\n );\n }\n}\n\n/** Bound the wire body while consuming it, before allocating the complete JSON\n * string. Reader cleanup must never replace the original transport/JSON error. */\nexport async function readBoundedJsonResponse(\n response: Response,\n maximumBytes: number,\n label: string,\n): Promise<unknown> {\n const reader = response.body?.getReader();\n if (!reader) return parseBoundedJson(\"\", maximumBytes, label);\n const decoder = new TextDecoder();\n let bytes = 0;\n let text = \"\";\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"response_too_large\",\n `${label} exceeds the maximum of ${maximumBytes} bytes.`,\n );\n }\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n return parseBoundedJson(text, maximumBytes, label);\n } catch (error) {\n try { await reader.cancel(); } catch { /* Preserve the primary failure. */ }\n throw error;\n } finally {\n try { reader.releaseLock(); } catch { /* Never mask a transport/parse failure. */ }\n }\n}\n\nfunction normalizeCanonicalJson(value: unknown): CanonicalJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n \"Canonical JSON cannot contain a non-finite number.\",\n );\n }\n return Object.is(value, -0) ? 0 : value;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeCanonicalJson(entry));\n }\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n \"Canonical JSON accepts only plain objects.\",\n );\n }\n const result: Record<string, CanonicalJsonValue> = Object.create(null);\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const entry = (value as Record<string, unknown>)[key];\n if (entry === undefined || typeof entry === \"function\" || typeof entry === \"symbol\") {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n `Canonical JSON cannot contain ${typeof entry} at ${key}.`,\n );\n }\n result[key] = normalizeCanonicalJson(entry);\n }\n return result;\n }\n throw new OpenPondProtocolError(\n \"non_json_value\",\n `Canonical JSON cannot contain ${typeof value}.`,\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,58 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
sourceId: ReleaseIdSchema,
|
|
13
|
-
name: z.string().trim().min(1).max(100),
|
|
14
|
-
keyPrefix: z.string().min(1).max(100),
|
|
15
|
-
createdAt: z.iso.datetime(),
|
|
16
|
-
expiresAt: z.iso.datetime(),
|
|
17
|
-
revokedAt: z.iso.datetime().nullable()
|
|
18
|
-
}).strict();
|
|
19
|
-
var LearningSourceCredentialSecretSchema = z.string().regex(/^opk_key_[A-Za-z0-9]{16}_[A-Za-z0-9]{48}$/);
|
|
20
|
-
var LearningSourceCredentialRequestSchema = z.discriminatedUnion("action", [
|
|
21
|
-
z.object({ action: z.literal("create"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, name: z.string().trim().min(1).max(100), expiresAt: z.iso.datetime(), operationId: ReleaseIdSchema, apiKey: LearningSourceCredentialSecretSchema }).strict(),
|
|
22
|
-
z.object({ action: z.literal("list"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, afterId: ReleaseIdSchema.optional(), limit: z.number().int().min(1).max(100).default(30) }).strict(),
|
|
23
|
-
z.object({ action: z.literal("revoke"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, id: ReleaseIdSchema }).strict()
|
|
24
|
-
]);
|
|
25
|
-
var LearningSourceCredentialCreatedSchema = z.object({ credential: LearningSourceCredentialSchema, apiKey: LearningSourceCredentialSecretSchema }).strict();
|
|
26
|
-
var LearningSourceCredentialPageSchema = z.object({ items: z.array(LearningSourceCredentialSchema).max(100), nextCursor: ReleaseIdSchema.nullable() }).strict();
|
|
27
|
-
var LearningSourceConfigurationRequestSchema = z.object({ scope: ReleaseIdSchema, sourceId: ReleaseIdSchema }).strict();
|
|
28
|
-
var LearningSourceConfigurationSchema = z.object({
|
|
29
|
-
scope: ReleaseIdSchema,
|
|
30
|
-
source: LearningRevisionRefSchema,
|
|
31
|
-
taskDefinition: LearningRevisionRefSchema,
|
|
32
|
-
enabled: z.boolean(),
|
|
33
|
-
allowedSplits: z.array(TaskSplitSchema).min(1).max(4)
|
|
34
|
-
}).strict();
|
|
35
|
-
function createSourceCredentialRequest(input) {
|
|
36
|
-
return { ...input, operationId: crypto.randomUUID(), apiKey: `opk_key_${randomToken(16)}_${randomToken(48)}` };
|
|
37
|
-
}
|
|
38
|
-
function randomToken(length) {
|
|
39
|
-
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
40
|
-
let value = "";
|
|
41
|
-
while (value.length < length) {
|
|
42
|
-
for (const byte of crypto.getRandomValues(new Uint8Array(64))) {
|
|
43
|
-
if (byte < 248) value += alphabet[byte % 62];
|
|
44
|
-
if (value.length === length) return value;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return value;
|
|
48
|
-
}
|
|
49
|
-
function assertLearningCredentialExpiry(expiresAt, now) {
|
|
50
|
-
const expires = Date.parse(z.iso.datetime().parse(expiresAt));
|
|
51
|
-
if (expires <= now.getTime() || expires > now.getTime() + 90 * 24 * 60 * 60 * 1e3) throw new Error("Source credentials must expire within 90 days.");
|
|
52
|
-
}
|
|
2
|
+
OpenPondLearningError
|
|
3
|
+
} from "./chunk-U2KGUAIS.js";
|
|
4
|
+
import {
|
|
5
|
+
LearningSourceConfigurationRequestSchema,
|
|
6
|
+
LearningSourceConfigurationSchema,
|
|
7
|
+
LearningSourceCredentialCreatedSchema,
|
|
8
|
+
LearningSourceCredentialPageSchema,
|
|
9
|
+
LearningSourceCredentialRequestSchema,
|
|
10
|
+
LearningSourceCredentialSchema
|
|
11
|
+
} from "./chunk-IZ26ZCGU.js";
|
|
53
12
|
|
|
54
13
|
// src/learning-client.ts
|
|
55
|
-
import { z
|
|
14
|
+
import { z } from "zod";
|
|
56
15
|
import {
|
|
57
16
|
LearningCommandRequestSchema,
|
|
58
17
|
LearningOperationResultSchema,
|
|
@@ -65,30 +24,18 @@ import {
|
|
|
65
24
|
learningResourceSchemas
|
|
66
25
|
} from "@openpond/evals/learning";
|
|
67
26
|
import { assertBoundedTaskJson } from "@openpond/evals/task-schema";
|
|
68
|
-
var LearningBatchPublicationSchema =
|
|
69
|
-
batchId:
|
|
70
|
-
modelProjectId:
|
|
27
|
+
var LearningBatchPublicationSchema = z.object({
|
|
28
|
+
batchId: z.string().trim().min(1).max(500),
|
|
29
|
+
modelProjectId: z.string().trim().min(1).max(500)
|
|
71
30
|
}).strict();
|
|
72
|
-
var LearningBatchPublicationResultSchema =
|
|
73
|
-
batchId:
|
|
74
|
-
projectId:
|
|
75
|
-
tasksetId:
|
|
76
|
-
releaseId:
|
|
77
|
-
revision:
|
|
78
|
-
contentHash:
|
|
31
|
+
var LearningBatchPublicationResultSchema = z.object({
|
|
32
|
+
batchId: z.string().min(1),
|
|
33
|
+
projectId: z.string().min(1),
|
|
34
|
+
tasksetId: z.string().min(1),
|
|
35
|
+
releaseId: z.string().min(1),
|
|
36
|
+
revision: z.number().int().positive(),
|
|
37
|
+
contentHash: z.string().regex(/^[a-f0-9]{64}$/)
|
|
79
38
|
}).strict();
|
|
80
|
-
var OpenPondLearningError = class extends Error {
|
|
81
|
-
constructor(status, code, message, details) {
|
|
82
|
-
super(message);
|
|
83
|
-
this.status = status;
|
|
84
|
-
this.code = code;
|
|
85
|
-
this.details = details;
|
|
86
|
-
this.name = "OpenPondLearningError";
|
|
87
|
-
}
|
|
88
|
-
status;
|
|
89
|
-
code;
|
|
90
|
-
details;
|
|
91
|
-
};
|
|
92
39
|
var OpenPondLearningClient = class {
|
|
93
40
|
#options;
|
|
94
41
|
constructor(options) {
|
|
@@ -167,7 +114,7 @@ var OpenPondLearningClient = class {
|
|
|
167
114
|
}
|
|
168
115
|
async list(kind, query = {}, options = {}) {
|
|
169
116
|
const request = LearningReadRequestSchema.parse({ action: "list", scope: this.#options.scope, kind, ...query });
|
|
170
|
-
return
|
|
117
|
+
return z.object({ items: z.array(learningResourceSchemas[kind]).max(100), nextCursor: z.string().nullable() }).strict().parse(await this.#request("read", request, options));
|
|
171
118
|
}
|
|
172
119
|
/** Hosted publication only: stores an immutable package and attaches it, without starting training. */
|
|
173
120
|
async publishBatch(input, options = {}) {
|
|
@@ -187,7 +134,7 @@ var OpenPondLearningClient = class {
|
|
|
187
134
|
});
|
|
188
135
|
const payload = await readBoundedLearningResponse(response);
|
|
189
136
|
if (!response.ok) {
|
|
190
|
-
const error =
|
|
137
|
+
const error = z.object({ code: z.string().optional(), error: z.string().optional() }).passthrough().safeParse(payload);
|
|
191
138
|
throw new OpenPondLearningError(response.status, error.success ? error.data.code ?? "learning_request_failed" : "learning_request_failed", error.success ? error.data.error ?? `Learning request failed (${response.status}).` : `Learning request failed (${response.status}).`, payload);
|
|
192
139
|
}
|
|
193
140
|
return payload;
|
|
@@ -219,19 +166,9 @@ async function readBoundedLearningResponse(response) {
|
|
|
219
166
|
}
|
|
220
167
|
|
|
221
168
|
export {
|
|
222
|
-
LearningSourceCredentialSchema,
|
|
223
|
-
LearningSourceCredentialSecretSchema,
|
|
224
|
-
LearningSourceCredentialRequestSchema,
|
|
225
|
-
LearningSourceCredentialCreatedSchema,
|
|
226
|
-
LearningSourceCredentialPageSchema,
|
|
227
|
-
LearningSourceConfigurationRequestSchema,
|
|
228
|
-
LearningSourceConfigurationSchema,
|
|
229
|
-
createSourceCredentialRequest,
|
|
230
|
-
assertLearningCredentialExpiry,
|
|
231
169
|
LearningBatchPublicationSchema,
|
|
232
170
|
LearningBatchPublicationResultSchema,
|
|
233
|
-
OpenPondLearningError,
|
|
234
171
|
OpenPondLearningClient,
|
|
235
172
|
readBoundedLearningResponse
|
|
236
173
|
};
|
|
237
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-C3TS766N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/learning-client.ts"],"sourcesContent":["import { OpenPondLearningError } from \"./learning-error.js\";\nexport { OpenPondLearningError } from \"./learning-error.js\";\nimport { z } from \"zod\";\nimport {\n LearningCommandRequestSchema, LearningOperationResultSchema, LearningReadRequestSchema,\n TaskEvidenceInspectionResultSchema, sameLearningRef, type LearningRevisionRef,\n LearningPolicyInspectionResultSchema,\n LearningTaskQueueInspectionSchema,\n assertLearningRequestJson,\n learningResourceSchemas, type LearningCommand, type LearningOperationResult,\n type LearningResourceFor, type LearningResourceKind, type LearningResourcePage,\n type LearningResourceQuery, type TaskExampleSubmission, type TaskFeedbackSubmission,\n} from \"@openpond/evals/learning\";\nimport { assertBoundedTaskJson } from \"@openpond/evals/task-schema\";\nimport { LearningSourceCredentialSchema, LearningSourceCredentialRequestSchema, LearningSourceCredentialCreatedSchema, LearningSourceCredentialPageSchema, LearningSourceConfigurationRequestSchema, LearningSourceConfigurationSchema, type LearningSourceCredentialRequest } from \"./learning-credentials.js\";\n\nexport interface OpenPondLearningClientOptions {\n apiKey: string;\n baseUrl: string;\n /** Local profile or hosted team scope. The server checks the credential's ownership. */\n scope: string;\n fetch?: typeof globalThis.fetch;\n}\nexport interface LearningRequestOptions { signal?: AbortSignal }\nexport const LearningBatchPublicationSchema = z.object({\n batchId: z.string().trim().min(1).max(500), modelProjectId: z.string().trim().min(1).max(500),\n}).strict();\nexport const LearningBatchPublicationResultSchema = z.object({\n batchId: z.string().min(1), projectId: z.string().min(1), tasksetId: z.string().min(1),\n releaseId: z.string().min(1), revision: z.number().int().positive(), contentHash: z.string().regex(/^[a-f0-9]{64}$/),\n}).strict();\n/** The same portable commands are sent to the local and hosted execution owner. */\nexport class OpenPondLearningClient {\n readonly #options: OpenPondLearningClientOptions;\n constructor(options: OpenPondLearningClientOptions) {\n if (!options.apiKey.trim() || !options.scope.trim()) throw new Error(\"Learning API key and scope are required.\");\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new Error(\"Learning base URL must be an HTTP(S) endpoint without credentials, query, or fragment.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async command(command: LearningCommand, options: LearningRequestOptions = {}): Promise<LearningOperationResult> {\n assertLearningRequestJson(command);\n const request = LearningCommandRequestSchema.parse({ scope: this.#options.scope, command });\n const result = LearningOperationResultSchema.parse(await this.#request(\"commands\", request, options));\n if (result.operationId !== command.operationId) throw new OpenPondLearningError(502, \"operation_identity_mismatch\", \"Learning response did not match the submitted operation.\", null);\n return result;\n }\n\n submitExample(example: TaskExampleSubmission, options: LearningRequestOptions = {}) {\n return this.command({ action: \"submit_example\", operationId: example.idempotencyKey, example }, options);\n }\n\n submitFeedback(feedback: TaskFeedbackSubmission, options: LearningRequestOptions = {}) {\n return this.command({ action: \"submit_feedback\", operationId: feedback.idempotencyKey, feedback }, options);\n }\n\n async get<K extends LearningResourceKind>(kind: K, id: string, revision?: number, options: LearningRequestOptions = {}): Promise<LearningResourceFor<K>> {\n const request = LearningReadRequestSchema.parse({ action: \"get\", scope: this.#options.scope, kind, id, ...(revision === undefined ? {} : { revision }) });\n return learningResourceSchemas[kind].parse(await this.#request(\"read\", request, options)) as LearningResourceFor<K>;\n }\n\n async inspectEvidence(evidence: LearningRevisionRef, options: LearningRequestOptions = {}) {\n const request = LearningReadRequestSchema.parse({ action: \"inspect_evidence\", scope: this.#options.scope, evidence });\n const result = TaskEvidenceInspectionResultSchema.parse(await this.#request(\"read\", request, options));\n if (!sameLearningRef(result.evidence, evidence)) throw new OpenPondLearningError(502, \"evidence_identity_mismatch\", \"Inspection did not match the requested evidence release.\", null);\n return result;\n }\n\n /** Read current shared eligibility and budget without reserving or launching work. */\n async inspectTaskQueue(modelProjectId: string | null = null, options: LearningRequestOptions = {}) {\n const request = LearningReadRequestSchema.parse({ action: \"inspect_task_queue\", scope: this.#options.scope, modelProjectId });\n const result = LearningTaskQueueInspectionSchema.parse(await this.#request(\"read\", request, options));\n if (result.modelProjectId !== modelProjectId) throw new OpenPondLearningError(502, \"model_identity_mismatch\", \"Task queue did not match the requested Model.\", null);\n return result;\n }\n\n /** Read current shared eligibility and budget without reserving or launching work. */\n async inspectPolicy(policy: LearningRevisionRef, options: LearningRequestOptions = {}) {\n const request = LearningReadRequestSchema.parse({ action: \"inspect_policy\", scope: this.#options.scope, policy });\n const result = LearningPolicyInspectionResultSchema.parse(await this.#request(\"read\", request, options));\n if (!sameLearningRef(result.policy, policy)) throw new OpenPondLearningError(502, \"policy_identity_mismatch\", \"Inspection did not match the requested policy release.\", null);\n return result;\n }\n\n /** Prepare once with createSourceCredentialRequest and reuse it for retries. */\n async createSourceCredential(input: Omit<Extract<LearningSourceCredentialRequest, { action: \"create\" }>, \"action\" | \"scope\">, options: LearningRequestOptions = {}) {\n const request = LearningSourceCredentialRequestSchema.parse({ ...input, action: \"create\", scope: this.#options.scope });\n const result = LearningSourceCredentialCreatedSchema.parse(await this.#request(\"credentials\", request, options));\n this.#assertCredentialScope(result.credential, input.sourceId);\n if (result.apiKey !== input.apiKey || !input.apiKey.startsWith(`${result.credential.keyPrefix}_`)) throw new OpenPondLearningError(502, \"credential_identity_mismatch\", \"Credential response did not match the prepared credential.\", null);\n return result;\n }\n\n async listSourceCredentials(sourceId: string, query: { afterId?: string; limit?: number } = {}, options: LearningRequestOptions = {}) {\n const request = LearningSourceCredentialRequestSchema.parse({ ...query, action: \"list\", scope: this.#options.scope, sourceId });\n const result = LearningSourceCredentialPageSchema.parse(await this.#request(\"credentials\", request, options));\n if (result.items.length > (query.limit ?? 30)) throw new OpenPondLearningError(502, \"credential_page_invalid\", \"Credential response exceeded the requested page size.\", null);\n for (const item of result.items) this.#assertCredentialScope(item, sourceId);\n return result;\n }\n\n async revokeSourceCredential(sourceId: string, id: string, options: LearningRequestOptions = {}) {\n const request = LearningSourceCredentialRequestSchema.parse({ action: \"revoke\", scope: this.#options.scope, sourceId, id });\n const result = LearningSourceCredentialSchema.parse(await this.#request(\"credentials\", request, options));\n this.#assertCredentialScope(result, sourceId);\n if (result.id !== id || result.revokedAt === null) throw new OpenPondLearningError(502, \"credential_revocation_mismatch\", \"Credential revocation did not match the requested credential.\", null);\n return result;\n }\n\n async sourceConfiguration(sourceId: string, options: LearningRequestOptions = {}) {\n const request = LearningSourceConfigurationRequestSchema.parse({ scope: this.#options.scope, sourceId });\n const result = LearningSourceConfigurationSchema.parse(await this.#request(\"source-config\", request, options));\n if (result.scope !== this.#options.scope || result.source.id !== sourceId) throw new OpenPondLearningError(502, \"source_identity_mismatch\", \"Source configuration did not match the requested source.\", null);\n return result;\n }\n\n #assertCredentialScope(value: { scope: string; sourceId: string }, sourceId: string) {\n if (value.scope !== this.#options.scope || value.sourceId !== sourceId) throw new OpenPondLearningError(502, \"credential_scope_mismatch\", \"Credential response did not match the requested source.\", null);\n }\n\n async list<K extends LearningResourceKind>(kind: K, query: Partial<LearningResourceQuery> = {}, options: LearningRequestOptions = {}): Promise<LearningResourcePage<K>> {\n const request = LearningReadRequestSchema.parse({ action: \"list\", scope: this.#options.scope, kind, ...query });\n return z.object({ items: z.array(learningResourceSchemas[kind]).max(100), nextCursor: z.string().nullable() }).strict().parse(await this.#request(\"read\", request, options)) as LearningResourcePage<K>;\n }\n\n /** Hosted publication only: stores an immutable package and attaches it, without starting training. */\n async publishBatch(input: z.infer<typeof LearningBatchPublicationSchema>, options: LearningRequestOptions = {}) {\n const request = LearningBatchPublicationSchema.parse(input);\n const result = LearningBatchPublicationResultSchema.parse(await this.#request(\"publish-batch\", { ...request, scope: this.#options.scope }, options));\n if (result.batchId !== request.batchId) throw new OpenPondLearningError(502, \"batch_identity_mismatch\", \"Published batch response did not match the requested batch.\", null);\n return result;\n }\n\n async #request(endpoint: \"commands\" | \"read\" | \"publish-batch\" | \"credentials\" | \"source-config\", body: unknown, options: LearningRequestOptions): Promise<unknown> {\n assertBoundedTaskJson(body, 16_777_216);\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/learning/${endpoint}`, {\n method: \"POST\", headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"Content-Type\": \"application/json\", Accept: \"application/json\", \"X-OpenPond-Team-Id\": this.#options.scope }, body: JSON.stringify(body), signal: options.signal,\n redirect: \"error\",\n });\n const payload = await readBoundedLearningResponse(response);\n if (!response.ok) {\n const error = z.object({ code: z.string().optional(), error: z.string().optional() }).passthrough().safeParse(payload);\n throw new OpenPondLearningError(response.status, error.success ? error.data.code ?? \"learning_request_failed\" : \"learning_request_failed\", error.success ? error.data.error ?? `Learning request failed (${response.status}).` : `Learning request failed (${response.status}).`, payload);\n }\n return payload;\n }\n}\n\nexport async function readBoundedLearningResponse(response: Response): Promise<unknown> {\n const maximumBytes = 16_777_216;\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondLearningError(response.status, \"empty_response\", \"Learning response was empty.\", null);\n const decoder = new TextDecoder();\n let bytes = 0;\n let text = \"\";\n try {\n while (true) {\n const next = await reader.read();\n if (next.done) break;\n bytes += next.value.byteLength;\n if (bytes > maximumBytes) throw new OpenPondLearningError(response.status, \"response_too_large\", \"Learning response exceeded 16 MiB; request a smaller page.\", null);\n text += decoder.decode(next.value, { stream: true });\n }\n text += decoder.decode();\n const value: unknown = JSON.parse(text);\n assertBoundedTaskJson(value, maximumBytes);\n return value;\n } finally {\n await reader.cancel();\n reader.releaseLock();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
HarnessExperimentPolicySchema,
|
|
3
3
|
ModelTasksetRunRequestSchema
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZYDDHHZZ.js";
|
|
5
5
|
import {
|
|
6
6
|
contentHash
|
|
7
7
|
} from "./chunk-H3JZ3P5T.js";
|
|
@@ -172,4 +172,4 @@ export {
|
|
|
172
172
|
verifyExperimentDefinition,
|
|
173
173
|
experimentDefinitionRef
|
|
174
174
|
};
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-C4W2MEFP.js.map
|