openpond-sdk 0.3.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MODEL_STARTERS.md +26 -0
- package/TASKSETS.md +55 -0
- package/dist/actions-local.js +67 -118
- package/dist/actions-local.js.map +4 -4
- package/dist/actions.js +4 -92
- package/dist/actions.js.map +4 -4
- package/dist/chunk-25TBEGXB.js +220 -0
- package/dist/chunk-25TBEGXB.js.map +7 -0
- package/dist/chunk-27ETSPHQ.js +83 -0
- package/dist/chunk-27ETSPHQ.js.map +7 -0
- package/dist/chunk-5PRP457R.js +477 -0
- package/dist/chunk-5PRP457R.js.map +7 -0
- package/dist/chunk-65D4C7HP.js +273 -0
- package/dist/chunk-65D4C7HP.js.map +7 -0
- package/dist/chunk-6LGGLXAM.js +2395 -0
- package/dist/chunk-6LGGLXAM.js.map +7 -0
- package/dist/chunk-747CMU2Y.js +222 -0
- package/dist/chunk-747CMU2Y.js.map +7 -0
- package/dist/chunk-7O5X7DBU.js +80 -0
- package/dist/chunk-7O5X7DBU.js.map +7 -0
- package/dist/chunk-A4ZDOZKP.js +115 -0
- package/dist/chunk-A4ZDOZKP.js.map +7 -0
- package/dist/chunk-APHPXQEA.js +155 -0
- package/dist/chunk-APHPXQEA.js.map +7 -0
- package/dist/chunk-AVW35YOH.js +574 -0
- package/dist/chunk-AVW35YOH.js.map +7 -0
- package/dist/chunk-EPJM7VEV.js +177 -0
- package/dist/chunk-EPJM7VEV.js.map +7 -0
- package/dist/chunk-EV4PKJWN.js +1373 -0
- package/dist/chunk-EV4PKJWN.js.map +7 -0
- package/dist/chunk-K5ZCYOZO.js +49 -0
- package/dist/chunk-K5ZCYOZO.js.map +7 -0
- package/dist/chunk-LXXQVGQY.js +1 -0
- package/dist/chunk-LXXQVGQY.js.map +7 -0
- package/dist/chunk-NF63YMOL.js +593 -0
- package/dist/chunk-NF63YMOL.js.map +7 -0
- package/dist/chunk-P27DQ65Z.js +138 -0
- package/dist/chunk-P27DQ65Z.js.map +7 -0
- package/dist/chunk-QLEJOCQX.js +72 -0
- package/dist/chunk-QLEJOCQX.js.map +7 -0
- package/dist/chunk-S7I45WJQ.js +57 -0
- package/dist/chunk-S7I45WJQ.js.map +7 -0
- package/dist/index.js +33 -2488
- package/dist/index.js.map +4 -4
- package/dist/learning.js +16 -2042
- package/dist/learning.js.map +4 -4
- package/dist/model-batch-review.js +5 -42
- package/dist/model-batch-review.js.map +3 -3
- package/dist/model-projects.js +29 -430
- package/dist/model-projects.js.map +3 -3
- package/dist/model-starter-attempts.js +13 -420
- package/dist/model-starter-attempts.js.map +4 -4
- package/dist/model-starter-catalog.js +17 -460
- package/dist/model-starter-catalog.js.map +4 -4
- package/dist/model-starters.js +32 -709
- package/dist/model-starters.js.map +4 -4
- package/dist/model-taskset-authoring.js +11 -44
- package/dist/model-taskset-authoring.js.map +3 -3
- package/dist/model-taskset-runs.js +196 -0
- package/dist/model-taskset-runs.js.map +7 -0
- package/dist/profile-actions.js +4 -211
- package/dist/profile-actions.js.map +3 -3
- package/dist/project-actions.js +4 -224
- package/dist/project-actions.js.map +3 -3
- package/dist/refiner.js +14 -554
- package/dist/refiner.js.map +4 -4
- package/dist/taskset-catalog.js +9 -104
- package/dist/taskset-catalog.js.map +3 -3
- package/dist/taskset-drafts.js +465 -0
- package/dist/taskset-drafts.js.map +7 -0
- package/dist/taskset-packages.js +946 -3089
- package/dist/taskset-packages.js.map +4 -4
- package/dist/training.js +43 -822
- package/dist/training.js.map +4 -4
- package/dist/types/packages/sdk/src/index.d.ts +3 -3
- package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-client.d.ts +130 -0
- package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/learning.d.ts +1 -129
- package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts +568 -0
- package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +722 -0
- package/dist/types/packages/sdk/src/model-taskset-runs.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +1170 -0
- package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +560 -0
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts +92 -0
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts +15 -0
- package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts +18 -0
- package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +1681 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts +19 -0
- package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2713 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +1000 -0
- package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +429 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +284 -0
- package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +846 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-files.d.ts +8 -0
- package/dist/types/packages/sdk/src/taskset-draft-files.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts +28 -0
- package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts +8 -0
- package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +967 -0
- package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts +10 -0
- package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +1297 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +1597 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-drafts.d.ts +16 -0
- package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +64 -0
- package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1514 -0
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/taskset-packages.d.ts +6 -0
- package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
- package/dist/workflows.js +4 -221
- package/dist/workflows.js.map +3 -3
- package/package.json +11 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/learning-credentials.ts", "../src/learning-client.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { ReleaseIdSchema } from \"@openpond/harness\";\nimport { LearningRevisionRefSchema } from \"@openpond/evals/learning\";\nimport { TaskSplitSchema } from \"@openpond/evals/tasksets\";\n\n/** Source credentials can submit evidence and feedback for one source only. */\nexport const LearningSourceCredentialSchema = z.object({\n id: ReleaseIdSchema,\n scope: ReleaseIdSchema,\n sourceId: ReleaseIdSchema,\n name: z.string().trim().min(1).max(100),\n keyPrefix: z.string().min(1).max(100),\n createdAt: z.iso.datetime(),\n expiresAt: z.iso.datetime(),\n revokedAt: z.iso.datetime().nullable(),\n}).strict();\nexport type LearningSourceCredential = z.infer<typeof LearningSourceCredentialSchema>;\nexport const LearningSourceCredentialSecretSchema = z.string().regex(/^opk_key_[A-Za-z0-9]{16}_[A-Za-z0-9]{48}$/);\n\nexport const LearningSourceCredentialRequestSchema = z.discriminatedUnion(\"action\", [\n 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(),\n z.object({ action: z.literal(\"list\"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, afterId: ReleaseIdSchema.optional(), limit: z.number().int().min(1).max(100).default(30) }).strict(),\n z.object({ action: z.literal(\"revoke\"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, id: ReleaseIdSchema }).strict(),\n]);\nexport type LearningSourceCredentialRequest = z.infer<typeof LearningSourceCredentialRequestSchema>;\nexport const LearningSourceCredentialCreatedSchema = z.object({ credential: LearningSourceCredentialSchema, apiKey: LearningSourceCredentialSecretSchema }).strict();\nexport const LearningSourceCredentialPageSchema = z.object({ items: z.array(LearningSourceCredentialSchema).max(100), nextCursor: ReleaseIdSchema.nullable() }).strict();\nexport const LearningSourceConfigurationRequestSchema = z.object({ scope: ReleaseIdSchema, sourceId: ReleaseIdSchema }).strict();\nexport const LearningSourceConfigurationSchema = z.object({\n scope: ReleaseIdSchema, source: LearningRevisionRefSchema, taskDefinition: LearningRevisionRefSchema,\n enabled: z.boolean(), allowedSplits: z.array(TaskSplitSchema).min(1).max(4),\n}).strict();\n\n/** Keep this request in memory for retries. Hosts persist hashes, never its secret. */\nexport function createSourceCredentialRequest(input: { sourceId: string; name: string; expiresAt: string }) {\n return { ...input, operationId: crypto.randomUUID(), apiKey: `opk_key_${randomToken(16)}_${randomToken(48)}` };\n}\n\nfunction randomToken(length: number): string {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let value = \"\";\n while (value.length < length) {\n for (const byte of crypto.getRandomValues(new Uint8Array(64))) {\n // Rejection sampling avoids modulo bias in the 62-character alphabet.\n if (byte < 248) value += alphabet[byte % 62];\n if (value.length === length) return value;\n }\n }\n return value;\n}\n\n/** Hosts enforce expiry when issuing and authenticating; tokens are never permanent. */\nexport function assertLearningCredentialExpiry(expiresAt: string, now: Date): void {\n const expires = Date.parse(z.iso.datetime().parse(expiresAt));\n if (expires <= now.getTime() || expires > now.getTime() + 90 * 24 * 60 * 60 * 1_000) throw new Error(\"Source credentials must expire within 90 days.\");\n}\n", "import { z } from \"zod\";\nimport {\n LearningCommandRequestSchema, LearningOperationResultSchema, LearningReadRequestSchema,\n TaskEvidenceInspectionResultSchema, sameLearningRef, type LearningRevisionRef,\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();\nexport class OpenPondLearningError extends Error {\n constructor(readonly status: number, readonly code: string, message: string, readonly details: unknown) {\n super(message);\n this.name = \"OpenPondLearningError\";\n }\n}\n\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 /** 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\nasync 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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["z", "z"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
apiFetch,
|
|
3
|
+
readApiJson
|
|
4
|
+
} from "./chunk-APHPXQEA.js";
|
|
5
|
+
|
|
6
|
+
// src/project-actions.ts
|
|
7
|
+
import { promises as fs } from "node:fs";
|
|
8
|
+
var OpenPondProjectActionsClient = class {
|
|
9
|
+
#apiKey;
|
|
10
|
+
#apiBaseUrl;
|
|
11
|
+
constructor(input) {
|
|
12
|
+
this.#apiKey = input.apiKey;
|
|
13
|
+
this.#apiBaseUrl = input.apiBaseUrl.replace(/\/+$/, "");
|
|
14
|
+
}
|
|
15
|
+
async list(input) {
|
|
16
|
+
const response = await apiFetch(
|
|
17
|
+
this.#apiBaseUrl,
|
|
18
|
+
this.#apiKey,
|
|
19
|
+
projectActionPath(input.projectId, "releases", input.teamId)
|
|
20
|
+
);
|
|
21
|
+
return (await readApiJson(response, "List Project Action releases")).releases;
|
|
22
|
+
}
|
|
23
|
+
async catalog(input) {
|
|
24
|
+
const response = await apiFetch(
|
|
25
|
+
this.#apiBaseUrl,
|
|
26
|
+
this.#apiKey,
|
|
27
|
+
projectActionPath(input.projectId, "catalog", input.teamId)
|
|
28
|
+
);
|
|
29
|
+
return (await readApiJson(response, "Get Project Action catalog")).catalog;
|
|
30
|
+
}
|
|
31
|
+
async publish(input) {
|
|
32
|
+
const [bundle, runner] = await Promise.all([
|
|
33
|
+
fs.readFile(input.build.bundlePath),
|
|
34
|
+
fs.readFile(input.build.runnerPath)
|
|
35
|
+
]);
|
|
36
|
+
const response = await apiFetch(
|
|
37
|
+
this.#apiBaseUrl,
|
|
38
|
+
this.#apiKey,
|
|
39
|
+
projectActionPath(input.projectId, "releases", input.teamId),
|
|
40
|
+
{
|
|
41
|
+
method: "POST",
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
sourceRef: input.sourceRef,
|
|
44
|
+
sourceCommitSha: input.sourceCommitSha,
|
|
45
|
+
bundleBase64: bundle.toString("base64"),
|
|
46
|
+
runnerBase64: runner.toString("base64"),
|
|
47
|
+
registry: input.build.registry,
|
|
48
|
+
manifest: input.build.manifest,
|
|
49
|
+
metadata: input.metadata
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
return (await readApiJson(response, "Publish Project Actions")).release;
|
|
54
|
+
}
|
|
55
|
+
async run(input) {
|
|
56
|
+
const response = await apiFetch(
|
|
57
|
+
this.#apiBaseUrl,
|
|
58
|
+
this.#apiKey,
|
|
59
|
+
projectActionPath(input.projectId, `actions/${encodeURIComponent(input.actionId)}`, input.teamId),
|
|
60
|
+
{
|
|
61
|
+
method: "POST",
|
|
62
|
+
body: JSON.stringify({
|
|
63
|
+
input: input.value ?? {},
|
|
64
|
+
releaseId: input.releaseId,
|
|
65
|
+
idempotencyKey: input.idempotencyKey,
|
|
66
|
+
callerType: input.callerType ?? "sdk",
|
|
67
|
+
callerId: input.callerId
|
|
68
|
+
}),
|
|
69
|
+
signal: input.signal,
|
|
70
|
+
timeoutMs: 15 * 60 * 1e3
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
return (await readApiJson(response, "Run Project Action")).invocation;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
function projectActionPath(projectId, suffix, teamId) {
|
|
77
|
+
return `/v1/project-actions/${encodeURIComponent(projectId)}/${suffix}?teamId=${encodeURIComponent(teamId)}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
OpenPondProjectActionsClient
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-27ETSPHQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/project-actions.ts"],
|
|
4
|
+
"sourcesContent": ["import { promises as fs } from \"node:fs\";\n\nimport { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nimport type { ProjectActionBuildResult, ProjectActionRegistry } from \"../../actions/src/types.js\";\n\nexport type ProjectActionRelease = {\n id: string;\n projectId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n status: string;\n createdAt: string;\n};\n\nexport type HostedProjectActionCatalog = {\n releaseId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n registry: ProjectActionRegistry;\n};\n\nexport type ProjectActionInvocation<TOutput = Record<string, unknown>> = {\n id: string;\n releaseId: string;\n projectId: string;\n actionId: string;\n status: \"running\" | \"succeeded\" | \"failed\";\n resultJson: TOutput;\n traceJson: Record<string, unknown>[];\n outputJson: Record<string, unknown>[];\n failureCode?: string | null;\n failureMessage?: string | null;\n};\n\ntype ProjectActionClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondProjectActionsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: ProjectActionClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async list(input: { projectId: string; teamId: string }): Promise<ProjectActionRelease[]> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n );\n return (await readApiJson<{ releases: ProjectActionRelease[] }>(response, \"List Project Action releases\")).releases;\n }\n\n async catalog(input: { projectId: string; teamId: string }): Promise<HostedProjectActionCatalog> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"catalog\", input.teamId),\n );\n return (await readApiJson<{ catalog: HostedProjectActionCatalog }>(response, \"Get Project Action catalog\")).catalog;\n }\n\n async publish(input: {\n projectId: string;\n teamId: string;\n sourceRef: string;\n sourceCommitSha: string;\n build: ProjectActionBuildResult;\n metadata?: Record<string, unknown>;\n }): Promise<ProjectActionRelease> {\n const [bundle, runner] = await Promise.all([\n fs.readFile(input.build.bundlePath),\n fs.readFile(input.build.runnerPath),\n ]);\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n sourceRef: input.sourceRef,\n sourceCommitSha: input.sourceCommitSha,\n bundleBase64: bundle.toString(\"base64\"),\n runnerBase64: runner.toString(\"base64\"),\n registry: input.build.registry,\n manifest: input.build.manifest,\n metadata: input.metadata,\n }),\n },\n );\n return (await readApiJson<{ release: ProjectActionRelease }>(response, \"Publish Project Actions\")).release;\n }\n\n async run<TOutput = Record<string, unknown>>(input: {\n projectId: string;\n teamId: string;\n actionId: string;\n value?: Record<string, unknown>;\n releaseId?: string;\n idempotencyKey?: string;\n callerType?: \"sdk\" | \"work\" | \"scheduled_work\" | \"website\" | \"internal\";\n callerId?: string;\n signal?: AbortSignal;\n }): Promise<ProjectActionInvocation<TOutput>> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, `actions/${encodeURIComponent(input.actionId)}`, input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n input: input.value ?? {},\n releaseId: input.releaseId,\n idempotencyKey: input.idempotencyKey,\n callerType: input.callerType ?? \"sdk\",\n callerId: input.callerId,\n }),\n signal: input.signal,\n timeoutMs: 15 * 60 * 1000,\n },\n );\n return (await readApiJson<{ invocation: ProjectActionInvocation<TOutput> }>(response, \"Run Project Action\")).invocation;\n }\n}\n\nfunction projectActionPath(projectId: string, suffix: string, teamId: string): string {\n return `/v1/project-actions/${encodeURIComponent(projectId)}/${suffix}?teamId=${encodeURIComponent(teamId)}`;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAAA,SAAS,YAAY,UAAU;AA0CxB,IAAM,+BAAN,MAAmC;AAAA,EAC/B;AAAA,EACA;AAAA,EAET,YAAY,OAAiC;AAC3C,SAAK,UAAU,MAAM;AACrB,SAAK,cAAc,MAAM,WAAW,QAAQ,QAAQ,EAAE;AAAA,EACxD;AAAA,EAEA,MAAM,KAAK,OAA+E;AACxF,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,YAAY,MAAM,MAAM;AAAA,IAC7D;AACA,YAAQ,MAAM,YAAkD,UAAU,8BAA8B,GAAG;AAAA,EAC7G;AAAA,EAEA,MAAM,QAAQ,OAAmF;AAC/F,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,WAAW,MAAM,MAAM;AAAA,IAC5D;AACA,YAAQ,MAAM,YAAqD,UAAU,4BAA4B,GAAG;AAAA,EAC9G;AAAA,EAEA,MAAM,QAAQ,OAOoB;AAChC,UAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzC,GAAG,SAAS,MAAM,MAAM,UAAU;AAAA,MAClC,GAAG,SAAS,MAAM,MAAM,UAAU;AAAA,IACpC,CAAC;AACD,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,YAAY,MAAM,MAAM;AAAA,MAC3D;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB,WAAW,MAAM;AAAA,UACjB,iBAAiB,MAAM;AAAA,UACvB,cAAc,OAAO,SAAS,QAAQ;AAAA,UACtC,cAAc,OAAO,SAAS,QAAQ;AAAA,UACtC,UAAU,MAAM,MAAM;AAAA,UACtB,UAAU,MAAM,MAAM;AAAA,UACtB,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AACA,YAAQ,MAAM,YAA+C,UAAU,yBAAyB,GAAG;AAAA,EACrG;AAAA,EAEA,MAAM,IAAuC,OAUC;AAC5C,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,kBAAkB,MAAM,WAAW,WAAW,mBAAmB,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM;AAAA,MAChG;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,MAAM,SAAS,CAAC;AAAA,UACvB,WAAW,MAAM;AAAA,UACjB,gBAAgB,MAAM;AAAA,UACtB,YAAY,MAAM,cAAc;AAAA,UAChC,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,QACD,QAAQ,MAAM;AAAA,QACd,WAAW,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AACA,YAAQ,MAAM,YAA8D,UAAU,oBAAoB,GAAG;AAAA,EAC/G;AACF;AAEA,SAAS,kBAAkB,WAAmB,QAAgB,QAAwB;AACpF,SAAO,uBAAuB,mBAAmB,SAAS,CAAC,IAAI,MAAM,WAAW,mBAAmB,MAAM,CAAC;AAC5G;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
// src/model-projects.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { assertBoundedTaskJson } from "@openpond/evals/task-schema";
|
|
4
|
+
|
|
5
|
+
// src/protocol.ts
|
|
6
|
+
var OPENPOND_TRAINING_PROTOCOL_MAJOR = 2;
|
|
7
|
+
var OPENPOND_TRAINING_MEDIA_TYPE = "application/vnd.openpond.training+json;version=2";
|
|
8
|
+
var OPENPOND_MODEL_PROJECT_MEDIA_TYPE = "application/vnd.openpond.model-project+json;version=2";
|
|
9
|
+
var TRAINING_JOB_SUBMISSION_MAX_BYTES = 1048576;
|
|
10
|
+
var TRAINING_INPUT_ARTIFACT_MAX_BYTES = 67108864;
|
|
11
|
+
var TRAINING_API_RESPONSE_MAX_BYTES = 8388608;
|
|
12
|
+
var MODEL_PROJECT_SYNC_MAX_BYTES = 524288;
|
|
13
|
+
var MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8388608;
|
|
14
|
+
var OpenPondProtocolError = class extends Error {
|
|
15
|
+
code;
|
|
16
|
+
constructor(code, message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "OpenPondProtocolError";
|
|
19
|
+
this.code = code;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
function canonicalJson(value) {
|
|
23
|
+
return JSON.stringify(normalizeCanonicalJson(value));
|
|
24
|
+
}
|
|
25
|
+
function canonicalJsonByteLength(value) {
|
|
26
|
+
return new TextEncoder().encode(canonicalJson(value)).byteLength;
|
|
27
|
+
}
|
|
28
|
+
async function canonicalSha256(value) {
|
|
29
|
+
const bytes = new TextEncoder().encode(canonicalJson(value));
|
|
30
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", bytes);
|
|
31
|
+
return Array.from(
|
|
32
|
+
new Uint8Array(digest),
|
|
33
|
+
(byte) => byte.toString(16).padStart(2, "0")
|
|
34
|
+
).join("");
|
|
35
|
+
}
|
|
36
|
+
function assertCanonicalPayloadSize(value, maximumBytes, label) {
|
|
37
|
+
const actualBytes = canonicalJsonByteLength(value);
|
|
38
|
+
if (actualBytes > maximumBytes) {
|
|
39
|
+
throw new OpenPondProtocolError(
|
|
40
|
+
"payload_too_large",
|
|
41
|
+
`${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function parseBoundedJson(text, maximumBytes, label) {
|
|
46
|
+
const actualBytes = new TextEncoder().encode(text).byteLength;
|
|
47
|
+
if (actualBytes > maximumBytes) {
|
|
48
|
+
throw new OpenPondProtocolError(
|
|
49
|
+
"response_too_large",
|
|
50
|
+
`${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(text);
|
|
55
|
+
} catch {
|
|
56
|
+
throw new OpenPondProtocolError(
|
|
57
|
+
"invalid_json",
|
|
58
|
+
`${label} was not valid JSON.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function normalizeCanonicalJson(value) {
|
|
63
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
if (typeof value === "number") {
|
|
67
|
+
if (!Number.isFinite(value)) {
|
|
68
|
+
throw new OpenPondProtocolError(
|
|
69
|
+
"non_json_value",
|
|
70
|
+
"Canonical JSON cannot contain a non-finite number."
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return Object.is(value, -0) ? 0 : value;
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(value)) {
|
|
76
|
+
return value.map((entry) => normalizeCanonicalJson(entry));
|
|
77
|
+
}
|
|
78
|
+
if (typeof value === "object") {
|
|
79
|
+
const prototype = Object.getPrototypeOf(value);
|
|
80
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
81
|
+
throw new OpenPondProtocolError(
|
|
82
|
+
"non_json_value",
|
|
83
|
+
"Canonical JSON accepts only plain objects."
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
const result = {};
|
|
87
|
+
for (const key of Object.keys(value).sort()) {
|
|
88
|
+
const entry = value[key];
|
|
89
|
+
if (entry === void 0 || typeof entry === "function" || typeof entry === "symbol") {
|
|
90
|
+
throw new OpenPondProtocolError(
|
|
91
|
+
"non_json_value",
|
|
92
|
+
`Canonical JSON cannot contain ${typeof entry} at ${key}.`
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
result[key] = normalizeCanonicalJson(entry);
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
throw new OpenPondProtocolError(
|
|
100
|
+
"non_json_value",
|
|
101
|
+
`Canonical JSON cannot contain ${typeof value}.`
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/model-projects.ts
|
|
106
|
+
var IdSchema = z.string().trim().min(1).max(500);
|
|
107
|
+
var HashSchema = z.string().regex(/^[a-f0-9]{64}$/);
|
|
108
|
+
var TimestampSchema = z.string().datetime({ offset: true });
|
|
109
|
+
var ModelProjectImmutableRefSchema = z.object({
|
|
110
|
+
id: IdSchema,
|
|
111
|
+
contentHash: HashSchema
|
|
112
|
+
}).strict();
|
|
113
|
+
var ModelProjectVersionedRefSchema = ModelProjectImmutableRefSchema.extend({
|
|
114
|
+
revision: z.number().int().positive()
|
|
115
|
+
}).strict();
|
|
116
|
+
var ModelProjectBaseModelSchema = z.object({
|
|
117
|
+
schemaVersion: z.literal("openpond.baseModelPreference.v1"),
|
|
118
|
+
modelId: IdSchema,
|
|
119
|
+
revision: z.string().trim().min(1).max(256).nullable(),
|
|
120
|
+
tokenizerRevision: z.string().trim().min(1).max(256).nullable(),
|
|
121
|
+
chatTemplateHash: z.string().trim().min(8).max(256).nullable(),
|
|
122
|
+
modelAssetId: IdSchema.nullable(),
|
|
123
|
+
source: z.enum(["managed", "local", "builtin"])
|
|
124
|
+
}).strict();
|
|
125
|
+
var ModelProjectTrainingMethodSchema = z.enum([
|
|
126
|
+
"sft",
|
|
127
|
+
"dpo",
|
|
128
|
+
"grpo",
|
|
129
|
+
"ppo",
|
|
130
|
+
"sdft",
|
|
131
|
+
"opd",
|
|
132
|
+
"opsd",
|
|
133
|
+
"sdpo"
|
|
134
|
+
]);
|
|
135
|
+
var ModelProjectRecipeDocumentSchema = z.object({
|
|
136
|
+
schemaVersion: z.string().regex(/^openpond\.[A-Za-z0-9]+Recipe\.v\d+$/),
|
|
137
|
+
method: ModelProjectTrainingMethodSchema,
|
|
138
|
+
parameterization: z.enum(["lora", "full"])
|
|
139
|
+
}).catchall(z.unknown());
|
|
140
|
+
var ModelProjectTrainingSetupSchema = z.object({
|
|
141
|
+
tasksetRef: ModelProjectVersionedRefSchema.nullable().default(null),
|
|
142
|
+
rewardBindingRef: ModelProjectVersionedRefSchema.nullable().optional(),
|
|
143
|
+
tasksetRelease: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
144
|
+
harnessRelease: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
145
|
+
baseModel: ModelProjectBaseModelSchema.nullable().default(null),
|
|
146
|
+
method: ModelProjectTrainingMethodSchema.nullable().default(null),
|
|
147
|
+
destinationId: IdSchema.nullable().default(null),
|
|
148
|
+
managedRolloutPlacement: z.enum(["local", "remote"]).default("remote"),
|
|
149
|
+
managedGpuPlacementObjective: z.enum(["fast", "balanced", "economical"]).default("balanced"),
|
|
150
|
+
managedGpuRequirement: z.enum(["any", "h100_hbm3"]).default("any"),
|
|
151
|
+
runPreset: z.enum(["small", "standard", "custom", "small_experiment"]).nullable().default(null),
|
|
152
|
+
recipe: ModelProjectRecipeDocumentSchema.nullable().default(null),
|
|
153
|
+
preferredMaximumSpendUsd: z.number().nonnegative().nullable().default(null),
|
|
154
|
+
preferredRetentionDays: z.number().int().nonnegative().nullable().default(null)
|
|
155
|
+
}).strict();
|
|
156
|
+
var HostedModelProjectTrainingSetupSchema = ModelProjectTrainingSetupSchema.omit({ managedGpuRequirement: true });
|
|
157
|
+
var HostedModelProjectLinkSchema = z.object({
|
|
158
|
+
schemaVersion: z.literal("openpond.hostedModelProjectLink.v1"),
|
|
159
|
+
apiOrigin: z.string().url().refine((value) => new URL(value).origin === value, "Use a canonical API origin.").nullable().default(null),
|
|
160
|
+
teamId: IdSchema,
|
|
161
|
+
projectId: IdSchema,
|
|
162
|
+
portableProjectId: IdSchema,
|
|
163
|
+
revision: z.number().int().positive(),
|
|
164
|
+
etag: HashSchema,
|
|
165
|
+
syncedSourceRevision: z.number().int().positive(),
|
|
166
|
+
syncedAt: TimestampSchema,
|
|
167
|
+
tasksets: z.array(
|
|
168
|
+
z.object({
|
|
169
|
+
localTasksetId: IdSchema,
|
|
170
|
+
localTasksetHash: HashSchema.nullable().default(null),
|
|
171
|
+
releaseId: IdSchema,
|
|
172
|
+
releaseRevision: z.number().int().positive(),
|
|
173
|
+
releaseHash: HashSchema,
|
|
174
|
+
packageHash: HashSchema.nullable().default(null),
|
|
175
|
+
hostedTasksetId: IdSchema,
|
|
176
|
+
syncedAt: TimestampSchema
|
|
177
|
+
}).strict()
|
|
178
|
+
).max(1e4).default([])
|
|
179
|
+
}).strict();
|
|
180
|
+
var ModelProjectTasksetSyncSchema = z.object({
|
|
181
|
+
localTasksetId: IdSchema,
|
|
182
|
+
releaseId: IdSchema,
|
|
183
|
+
releaseRevision: z.number().int().positive(),
|
|
184
|
+
releaseHash: HashSchema,
|
|
185
|
+
state: z.enum(["syncing", "synced", "sync_failed"]),
|
|
186
|
+
hostedTasksetId: IdSchema.nullable().default(null),
|
|
187
|
+
lastAttemptAt: TimestampSchema,
|
|
188
|
+
syncedAt: TimestampSchema.nullable().default(null),
|
|
189
|
+
lastError: z.string().trim().min(1).max(5e3).nullable().default(null)
|
|
190
|
+
}).strict();
|
|
191
|
+
var ModelProjectSchema = z.object({
|
|
192
|
+
schemaVersion: z.literal("openpond.modelProject.v2"),
|
|
193
|
+
id: IdSchema,
|
|
194
|
+
profileId: IdSchema,
|
|
195
|
+
revision: z.number().int().positive().default(1),
|
|
196
|
+
name: z.string().trim().min(1).max(200),
|
|
197
|
+
objective: z.string().trim().max(5e3).nullable(),
|
|
198
|
+
defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
|
|
199
|
+
defaultDestinationId: IdSchema.nullable(),
|
|
200
|
+
trainingSetup: ModelProjectTrainingSetupSchema,
|
|
201
|
+
hosted: HostedModelProjectLinkSchema.nullable().default(null),
|
|
202
|
+
tasksetSyncs: z.array(ModelProjectTasksetSyncSchema).max(1e4).default([]),
|
|
203
|
+
createdAt: TimestampSchema,
|
|
204
|
+
updatedAt: TimestampSchema
|
|
205
|
+
}).strict();
|
|
206
|
+
var ModelProjectEditableSchema = ModelProjectSchema.pick({
|
|
207
|
+
id: true,
|
|
208
|
+
profileId: true,
|
|
209
|
+
name: true,
|
|
210
|
+
objective: true,
|
|
211
|
+
defaultBaseModel: true,
|
|
212
|
+
defaultDestinationId: true,
|
|
213
|
+
trainingSetup: true
|
|
214
|
+
});
|
|
215
|
+
var ModelProjectSaveRequestSchema = z.object({
|
|
216
|
+
schemaVersion: z.literal("openpond.modelProjectSave.v1"),
|
|
217
|
+
operationId: IdSchema,
|
|
218
|
+
expectedRevision: z.number().int().nonnegative(),
|
|
219
|
+
project: ModelProjectEditableSchema
|
|
220
|
+
}).strict();
|
|
221
|
+
var ModelProjectConfigurationCheckSchema = z.object({
|
|
222
|
+
schemaVersion: z.literal("openpond.modelProjectConfigurationCheck.v1"),
|
|
223
|
+
configurationHash: HashSchema,
|
|
224
|
+
projectId: IdSchema,
|
|
225
|
+
expectedRevision: z.number().int().nonnegative(),
|
|
226
|
+
checkedAt: TimestampSchema,
|
|
227
|
+
canSave: z.boolean(),
|
|
228
|
+
deferred: z.array(z.enum(["base_model", "taskset"])).max(2),
|
|
229
|
+
findings: z.array(z.object({
|
|
230
|
+
code: IdSchema,
|
|
231
|
+
severity: z.enum(["error", "warning"]),
|
|
232
|
+
message: z.string().min(1).max(5e3),
|
|
233
|
+
field: z.string().min(1).max(500).nullable()
|
|
234
|
+
}).strict()).max(100)
|
|
235
|
+
}).strict();
|
|
236
|
+
var ModelProjectBaseModelCandidateSchema = z.object({
|
|
237
|
+
id: IdSchema,
|
|
238
|
+
name: z.string().min(1).max(500),
|
|
239
|
+
available: z.boolean(),
|
|
240
|
+
preference: ModelProjectBaseModelSchema
|
|
241
|
+
}).strict();
|
|
242
|
+
async function modelProjectConfigurationHash(request) {
|
|
243
|
+
const parsed = parseModelProjectSaveRequest(request);
|
|
244
|
+
return canonicalSha256({ project: parsed.project, expectedRevision: parsed.expectedRevision });
|
|
245
|
+
}
|
|
246
|
+
function parseModelProjectSaveRequest(value) {
|
|
247
|
+
try {
|
|
248
|
+
assertBoundedTaskJson(value, MODEL_PROJECT_SYNC_MAX_BYTES);
|
|
249
|
+
} catch {
|
|
250
|
+
throw new OpenPondModelProjectApiError(400, {
|
|
251
|
+
schemaVersion: "openpond.modelProjectApiError.v2",
|
|
252
|
+
code: "model_configuration_json_invalid",
|
|
253
|
+
message: "Model configuration must be bounded JSON data.",
|
|
254
|
+
retryable: false,
|
|
255
|
+
requestId: null,
|
|
256
|
+
details: {}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return ModelProjectSaveRequestSchema.parse(value);
|
|
260
|
+
}
|
|
261
|
+
async function createModelProjectSaveRequest(project, expectedRevision) {
|
|
262
|
+
assertBoundedTaskJson(project, MODEL_PROJECT_SYNC_MAX_BYTES);
|
|
263
|
+
const editable = ModelProjectEditableSchema.parse(project);
|
|
264
|
+
assertCanonicalPayloadSize(editable, MODEL_PROJECT_SYNC_MAX_BYTES, "Model configuration");
|
|
265
|
+
const hash = await canonicalSha256({ project: editable, expectedRevision });
|
|
266
|
+
return parseModelProjectSaveRequest({
|
|
267
|
+
schemaVersion: "openpond.modelProjectSave.v1",
|
|
268
|
+
operationId: `model-save:${hash}`,
|
|
269
|
+
expectedRevision,
|
|
270
|
+
project: editable
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
var HostedModelProjectSyncSchema = z.object({
|
|
274
|
+
schemaVersion: z.literal("openpond.hostedModelProjectSync.v2"),
|
|
275
|
+
portableProjectId: IdSchema,
|
|
276
|
+
name: z.string().trim().min(1).max(200),
|
|
277
|
+
objective: z.string().trim().max(5e3).nullable(),
|
|
278
|
+
defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
|
|
279
|
+
defaultDestinationId: IdSchema.nullable(),
|
|
280
|
+
trainingSetup: HostedModelProjectTrainingSetupSchema,
|
|
281
|
+
sourceRevision: z.number().int().positive(),
|
|
282
|
+
sourceUpdatedAt: TimestampSchema,
|
|
283
|
+
expectedEtag: HashSchema.nullable().default(null)
|
|
284
|
+
}).strict();
|
|
285
|
+
var HostedModelProjectSummarySchema = z.object({
|
|
286
|
+
id: IdSchema,
|
|
287
|
+
teamId: IdSchema,
|
|
288
|
+
portableProjectId: IdSchema,
|
|
289
|
+
name: z.string().trim().min(1).max(200),
|
|
290
|
+
objective: z.string().trim().max(5e3).nullable(),
|
|
291
|
+
defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
|
|
292
|
+
defaultDestinationId: IdSchema.nullable(),
|
|
293
|
+
trainingSetup: HostedModelProjectTrainingSetupSchema,
|
|
294
|
+
sourceRevision: z.number().int().positive(),
|
|
295
|
+
sourceUpdatedAt: TimestampSchema,
|
|
296
|
+
revision: z.number().int().positive(),
|
|
297
|
+
etag: HashSchema,
|
|
298
|
+
createdAt: TimestampSchema,
|
|
299
|
+
updatedAt: TimestampSchema
|
|
300
|
+
}).strict();
|
|
301
|
+
var ModelProjectResourceSummarySchema = z.object({
|
|
302
|
+
kind: z.enum([
|
|
303
|
+
"taskset_release",
|
|
304
|
+
"harness_release",
|
|
305
|
+
"dataset_release",
|
|
306
|
+
"evidence_set",
|
|
307
|
+
"model_version",
|
|
308
|
+
"reward_model_version",
|
|
309
|
+
"evaluation_receipt"
|
|
310
|
+
]),
|
|
311
|
+
ref: ModelProjectImmutableRefSchema,
|
|
312
|
+
role: z.string().trim().min(1).max(200).nullable().default(null),
|
|
313
|
+
updatedAt: TimestampSchema
|
|
314
|
+
}).strict();
|
|
315
|
+
var HostedModelProjectDetailSchema = z.object({
|
|
316
|
+
project: HostedModelProjectSummarySchema,
|
|
317
|
+
resources: z.array(ModelProjectResourceSummarySchema).max(1e4),
|
|
318
|
+
jobCount: z.number().int().nonnegative(),
|
|
319
|
+
latestJobIds: z.array(IdSchema).max(100)
|
|
320
|
+
}).strict();
|
|
321
|
+
var ModelProjectApiErrorSchema = z.object({
|
|
322
|
+
schemaVersion: z.literal("openpond.modelProjectApiError.v2"),
|
|
323
|
+
code: z.string().trim().min(1).max(200),
|
|
324
|
+
message: z.string().trim().min(1).max(5e3),
|
|
325
|
+
retryable: z.boolean().default(false),
|
|
326
|
+
requestId: z.string().trim().min(1).max(500).nullable().default(null),
|
|
327
|
+
details: z.record(z.string(), z.unknown()).default({})
|
|
328
|
+
}).strict();
|
|
329
|
+
var OpenPondModelProjectApiError = class extends Error {
|
|
330
|
+
status;
|
|
331
|
+
code;
|
|
332
|
+
retryable;
|
|
333
|
+
requestId;
|
|
334
|
+
details;
|
|
335
|
+
constructor(status, error) {
|
|
336
|
+
super(error.message);
|
|
337
|
+
this.name = "OpenPondModelProjectApiError";
|
|
338
|
+
this.status = status;
|
|
339
|
+
this.code = error.code;
|
|
340
|
+
this.retryable = error.retryable;
|
|
341
|
+
this.requestId = error.requestId;
|
|
342
|
+
this.details = error.details;
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
function headersRecord(headers) {
|
|
346
|
+
const result = {};
|
|
347
|
+
new Headers(headers).forEach((value, key) => {
|
|
348
|
+
result[key] = value;
|
|
349
|
+
});
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
function createModelProjectsClient(input) {
|
|
353
|
+
const fetchImpl = input.fetch ?? fetch;
|
|
354
|
+
const baseUrl = input.baseUrl.replace(/\/$/, "");
|
|
355
|
+
async function request(pathname, init) {
|
|
356
|
+
const configuredHeaders = typeof input.headers === "function" ? await input.headers() : input.headers ?? {};
|
|
357
|
+
const response = await fetchImpl(`${baseUrl}${pathname}`, {
|
|
358
|
+
...init,
|
|
359
|
+
headers: {
|
|
360
|
+
accept: OPENPOND_MODEL_PROJECT_MEDIA_TYPE,
|
|
361
|
+
...init?.body ? { "content-type": OPENPOND_MODEL_PROJECT_MEDIA_TYPE } : {},
|
|
362
|
+
...headersRecord(configuredHeaders),
|
|
363
|
+
...headersRecord(init?.headers)
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
const body = parseBoundedJson(
|
|
367
|
+
await response.text(),
|
|
368
|
+
MODEL_PROJECT_API_RESPONSE_MAX_BYTES,
|
|
369
|
+
"Model Project API response"
|
|
370
|
+
);
|
|
371
|
+
if (!response.ok) {
|
|
372
|
+
const parsed = ModelProjectApiErrorSchema.safeParse(body);
|
|
373
|
+
if (parsed.success) {
|
|
374
|
+
throw new OpenPondModelProjectApiError(response.status, parsed.data);
|
|
375
|
+
}
|
|
376
|
+
throw new OpenPondProtocolError(
|
|
377
|
+
"invalid_error_response",
|
|
378
|
+
`Model Project request failed with HTTP ${response.status} and an invalid error envelope.`
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
return body;
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
async configurationCandidates() {
|
|
385
|
+
return z.object({ candidates: z.array(ModelProjectBaseModelCandidateSchema).max(1e3) }).strict().parse(
|
|
386
|
+
await request("/v1/model-projects/configuration/candidates", { headers: { accept: "application/json" } })
|
|
387
|
+
).candidates;
|
|
388
|
+
},
|
|
389
|
+
async checkConfiguration(value) {
|
|
390
|
+
const parsed = parseModelProjectSaveRequest(value);
|
|
391
|
+
return ModelProjectConfigurationCheckSchema.parse(await request("/v1/model-projects/configuration/check", {
|
|
392
|
+
method: "POST",
|
|
393
|
+
headers: { accept: "application/json", "content-type": "application/json" },
|
|
394
|
+
body: JSON.stringify(parsed)
|
|
395
|
+
}));
|
|
396
|
+
},
|
|
397
|
+
async saveConfiguration(value) {
|
|
398
|
+
const parsed = parseModelProjectSaveRequest(value);
|
|
399
|
+
return HostedModelProjectSummarySchema.parse(await request("/v1/model-projects/configuration/save", {
|
|
400
|
+
method: "POST",
|
|
401
|
+
headers: { accept: "application/json", "content-type": "application/json" },
|
|
402
|
+
body: JSON.stringify(parsed)
|
|
403
|
+
}));
|
|
404
|
+
},
|
|
405
|
+
async upsert(project) {
|
|
406
|
+
assertCanonicalPayloadSize(
|
|
407
|
+
project,
|
|
408
|
+
MODEL_PROJECT_SYNC_MAX_BYTES,
|
|
409
|
+
"Model Project sync"
|
|
410
|
+
);
|
|
411
|
+
const parsed = HostedModelProjectSyncSchema.parse(project);
|
|
412
|
+
const body = await request(
|
|
413
|
+
`/v1/model-projects/${encodeURIComponent(parsed.portableProjectId)}`,
|
|
414
|
+
{ method: "PUT", body: JSON.stringify(parsed) }
|
|
415
|
+
);
|
|
416
|
+
return HostedModelProjectSummarySchema.parse(
|
|
417
|
+
unwrapObject(body, "project")
|
|
418
|
+
);
|
|
419
|
+
},
|
|
420
|
+
async list() {
|
|
421
|
+
const body = await request("/v1/model-projects");
|
|
422
|
+
return z.array(HostedModelProjectSummarySchema).parse(unwrapObject(body, "projects"));
|
|
423
|
+
},
|
|
424
|
+
async get(projectId) {
|
|
425
|
+
const body = await request(
|
|
426
|
+
`/v1/model-projects/${encodeURIComponent(IdSchema.parse(projectId))}`
|
|
427
|
+
);
|
|
428
|
+
return HostedModelProjectDetailSchema.parse(body);
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
function unwrapObject(value, key) {
|
|
433
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return value;
|
|
434
|
+
return key in value ? value[key] : value;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export {
|
|
438
|
+
OPENPOND_TRAINING_PROTOCOL_MAJOR,
|
|
439
|
+
OPENPOND_TRAINING_MEDIA_TYPE,
|
|
440
|
+
OPENPOND_MODEL_PROJECT_MEDIA_TYPE,
|
|
441
|
+
TRAINING_JOB_SUBMISSION_MAX_BYTES,
|
|
442
|
+
TRAINING_INPUT_ARTIFACT_MAX_BYTES,
|
|
443
|
+
TRAINING_API_RESPONSE_MAX_BYTES,
|
|
444
|
+
MODEL_PROJECT_SYNC_MAX_BYTES,
|
|
445
|
+
MODEL_PROJECT_API_RESPONSE_MAX_BYTES,
|
|
446
|
+
OpenPondProtocolError,
|
|
447
|
+
canonicalJson,
|
|
448
|
+
canonicalJsonByteLength,
|
|
449
|
+
canonicalSha256,
|
|
450
|
+
assertCanonicalPayloadSize,
|
|
451
|
+
parseBoundedJson,
|
|
452
|
+
ModelProjectImmutableRefSchema,
|
|
453
|
+
ModelProjectVersionedRefSchema,
|
|
454
|
+
ModelProjectBaseModelSchema,
|
|
455
|
+
ModelProjectTrainingMethodSchema,
|
|
456
|
+
ModelProjectRecipeDocumentSchema,
|
|
457
|
+
ModelProjectTrainingSetupSchema,
|
|
458
|
+
HostedModelProjectTrainingSetupSchema,
|
|
459
|
+
HostedModelProjectLinkSchema,
|
|
460
|
+
ModelProjectTasksetSyncSchema,
|
|
461
|
+
ModelProjectSchema,
|
|
462
|
+
ModelProjectEditableSchema,
|
|
463
|
+
ModelProjectSaveRequestSchema,
|
|
464
|
+
ModelProjectConfigurationCheckSchema,
|
|
465
|
+
ModelProjectBaseModelCandidateSchema,
|
|
466
|
+
modelProjectConfigurationHash,
|
|
467
|
+
parseModelProjectSaveRequest,
|
|
468
|
+
createModelProjectSaveRequest,
|
|
469
|
+
HostedModelProjectSyncSchema,
|
|
470
|
+
HostedModelProjectSummarySchema,
|
|
471
|
+
ModelProjectResourceSummarySchema,
|
|
472
|
+
HostedModelProjectDetailSchema,
|
|
473
|
+
ModelProjectApiErrorSchema,
|
|
474
|
+
OpenPondModelProjectApiError,
|
|
475
|
+
createModelProjectsClient
|
|
476
|
+
};
|
|
477
|
+
//# sourceMappingURL=chunk-5PRP457R.js.map
|