openpond-sdk 0.12.23 → 0.12.25
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/PRODUCT_INTEGRATION.md +134 -0
- package/README.md +12 -1
- package/TASK_INGESTION.md +88 -86
- package/TRAINING_PROTOCOL.md +6 -2
- package/TRAINING_WORKFLOWS.md +16 -0
- package/dist/advanced-refiner-evaluations.js +3 -3
- package/dist/ai-sdk.js +224 -0
- package/dist/ai-sdk.js.map +1 -0
- package/dist/{chunk-NZRGRUYG.js → chunk-2OVNKPBZ.js} +17 -6
- package/dist/chunk-2OVNKPBZ.js.map +1 -0
- package/dist/{chunk-QIGMNB6M.js → chunk-3G3HUA32.js} +3 -3
- package/dist/{chunk-7G47YXQT.js → chunk-3MWFN7BA.js} +2 -2
- package/dist/{chunk-3BYFS4RO.js → chunk-47THZRUM.js} +5 -5
- package/dist/chunk-BRP3EBCR.js +245 -0
- package/dist/chunk-BRP3EBCR.js.map +1 -0
- package/dist/{chunk-BNBPKCIR.js → chunk-DDCR4KB5.js} +4 -4
- package/dist/{chunk-ZQ6QTYRE.js → chunk-GV6DEDBU.js} +10 -10
- package/dist/{chunk-ZQ6QTYRE.js.map → chunk-GV6DEDBU.js.map} +1 -1
- package/dist/{chunk-QCRNQMN4.js → chunk-IXFUYPGV.js} +2 -2
- package/dist/{chunk-Q4RGCEOI.js → chunk-JOMZJXGC.js} +3 -3
- package/dist/{chunk-OBI2MQYU.js → chunk-QRYEXPG7.js} +7 -7
- package/dist/{chunk-6EZAGTZG.js → chunk-RN5MK7NH.js} +4 -4
- package/dist/{chunk-GCUWJUUM.js → chunk-RTLJV4OS.js} +2 -2
- package/dist/{chunk-GBDBKGXW.js → chunk-T67LNKAK.js} +3 -3
- package/dist/{chunk-SP7DQEQM.js → chunk-XBFOFTK3.js} +5 -5
- package/dist/{chunk-AG6UJ3DI.js → chunk-YS7DF76T.js} +2 -2
- package/dist/{chunk-LEVXD73U.js → chunk-Z5APNTZE.js} +197 -190
- package/dist/chunk-Z5APNTZE.js.map +1 -0
- package/dist/connected-evidence.js +8 -8
- package/dist/dataset-workspaces.js +146 -85
- package/dist/dataset-workspaces.js.map +1 -1
- package/dist/experiment-evaluation-schedules.js +11 -11
- package/dist/experiments.js +15 -15
- package/dist/index.js +71 -44
- package/dist/index.js.map +1 -1
- package/dist/model-starter-catalog.js +2 -2
- package/dist/model-starters.js +2 -2
- package/dist/taskset-drafts.js +7 -7
- package/dist/taskset-packages.js +13 -13
- package/dist/training-bundle.js +12 -12
- package/dist/training.js +1936 -1809
- package/dist/training.js.map +1 -1
- package/dist/types/packages/sdk/src/ai-sdk.d.ts +6 -0
- package/dist/types/packages/sdk/src/ai-sdk.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts +21 -21
- package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts +8 -1
- package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +140 -140
- package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/dataset-workspace-error.d.ts +28 -0
- package/dist/types/packages/sdk/src/dataset-workspace-error.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/dataset-workspaces.d.ts +1 -0
- package/dist/types/packages/sdk/src/dataset-workspaces.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
- package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts +124 -34
- package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts +28 -28
- package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
- package/dist/types/packages/sdk/src/experiment-run-details.d.ts +7 -7
- package/dist/types/packages/sdk/src/index.d.ts +13 -4
- package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/managed-decision-executions.d.ts +347 -347
- package/dist/types/packages/sdk/src/managed-neuron-training-executions.d.ts +242 -21
- package/dist/types/packages/sdk/src/managed-neuron-training-executions.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +25 -25
- package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +28 -28
- package/dist/types/packages/sdk/src/neuron-training-artifact.d.ts +42 -3
- package/dist/types/packages/sdk/src/neuron-training-artifact.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/neuron-training-experiment-draft.d.ts +16 -1
- package/dist/types/packages/sdk/src/neuron-training-experiment-draft.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/neuron-training-model-serving.d.ts +168 -16
- package/dist/types/packages/sdk/src/neuron-training-model-serving.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/neuron-training-result.d.ts +42 -3
- package/dist/types/packages/sdk/src/neuron-training-result.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/neuron-training.d.ts +23 -2
- package/dist/types/packages/sdk/src/neuron-training.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/post-training.d.ts +7 -7
- package/dist/types/packages/sdk/src/product-model-response.d.ts +4 -0
- package/dist/types/packages/sdk/src/product-model-response.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/product-models.d.ts +76 -0
- package/dist/types/packages/sdk/src/product-models.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/steering-model-serving.d.ts +42 -4
- package/dist/types/packages/sdk/src/steering-model-serving.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/steering-profile-publication.d.ts +84 -8
- package/dist/types/packages/sdk/src/steering-profile-publication.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +20 -20
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
- package/dist/types/packages/sdk/src/training-evidence.d.ts +54 -0
- package/dist/types/packages/sdk/src/training-evidence.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-experiment-setup.d.ts +42 -2
- package/dist/types/packages/sdk/src/training-experiment-setup.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-harness-sources.d.ts +2 -2
- package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
- package/dist/types/packages/sdk/src/training-preparations.d.ts +1770 -485
- package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +25 -25
- package/dist/types/packages/sdk/src/training-usage-funding.d.ts +23 -0
- package/dist/types/packages/sdk/src/training-usage-funding.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training.d.ts +5189 -4445
- package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/types.d.ts +14 -1
- package/dist/types/packages/sdk/src/types.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/weight-experiment-authoring.d.ts +5 -2
- package/dist/types/packages/sdk/src/weight-experiment-authoring.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/weight-model-versions.d.ts +168 -16
- package/dist/types/packages/sdk/src/weight-model-versions.d.ts.map +1 -1
- package/fixtures/personalized-inference-request.schema.json +316 -0
- package/fixtures/python-foundation/schemas.json +8750 -8351
- package/package.json +18 -3
- package/dist/chunk-LEVXD73U.js.map +0 -1
- package/dist/chunk-NZRGRUYG.js.map +0 -1
- /package/dist/{chunk-QIGMNB6M.js.map → chunk-3G3HUA32.js.map} +0 -0
- /package/dist/{chunk-7G47YXQT.js.map → chunk-3MWFN7BA.js.map} +0 -0
- /package/dist/{chunk-3BYFS4RO.js.map → chunk-47THZRUM.js.map} +0 -0
- /package/dist/{chunk-BNBPKCIR.js.map → chunk-DDCR4KB5.js.map} +0 -0
- /package/dist/{chunk-QCRNQMN4.js.map → chunk-IXFUYPGV.js.map} +0 -0
- /package/dist/{chunk-Q4RGCEOI.js.map → chunk-JOMZJXGC.js.map} +0 -0
- /package/dist/{chunk-OBI2MQYU.js.map → chunk-QRYEXPG7.js.map} +0 -0
- /package/dist/{chunk-6EZAGTZG.js.map → chunk-RN5MK7NH.js.map} +0 -0
- /package/dist/{chunk-GCUWJUUM.js.map → chunk-RTLJV4OS.js.map} +0 -0
- /package/dist/{chunk-GBDBKGXW.js.map → chunk-T67LNKAK.js.map} +0 -0
- /package/dist/{chunk-SP7DQEQM.js.map → chunk-XBFOFTK3.js.map} +0 -0
- /package/dist/{chunk-AG6UJ3DI.js.map → chunk-YS7DF76T.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ai-sdk.ts","../src/product-model-response.ts"],"sourcesContent":["/** Optional integration: AI SDK 7 / @ai-sdk/openai-compatible 3 (LanguageModelV4). */\nimport {\n createOpenAICompatible,\n type OpenAICompatibleChatLanguageModel,\n} from \"@ai-sdk/openai-compatible\";\nimport { z } from \"zod\";\nimport { boundProductModelResponse } from \"./product-model-response.js\";\nimport { ProductModel, ProductModelError, productModelEndpoint } from \"./product-models.js\";\n\nconst Evidence = z.object({ openpond: z.record(z.string(), z.json()) }).passthrough();\nfunction metadata(raw: unknown) {\n const value = Evidence.safeParse(raw);\n return value.success ? { openpond: value.data.openpond } : undefined;\n}\n\n/** Use generateText/streamText with maxRetries: 0; paid inference is never safely replayable implicitly. */\nexport function toAIModel(\n model: ProductModel,\n): Pick<\n OpenAICompatibleChatLanguageModel,\n \"specificationVersion\" | \"provider\" | \"modelId\" | \"supportedUrls\" | \"doGenerate\" | \"doStream\"\n> {\n const connection = model.providerConnection();\n const provider = createOpenAICompatible({\n name: \"openpond\",\n baseURL: productModelEndpoint(connection.baseUrl!),\n apiKey: connection.apiKey,\n // The personalized gateway always supplies terminal usage and rejects\n // OpenAI's optional stream_options field.\n includeUsage: false,\n headers: connection.teamId ? { \"X-OpenPond-Team-Id\": connection.teamId } : undefined,\n transformRequestBody: (raw) => {\n const body = JSON.parse(JSON.stringify(raw)) as Record<string, unknown>;\n if (body.model !== model.id)\n throw new ProductModelError(\"model_override_forbidden\", 0, false);\n const allowed = new Set([\n \"model\",\n \"messages\",\n \"stream\",\n \"max_tokens\",\n \"temperature\",\n \"top_p\",\n \"seed\",\n \"stop\",\n \"tools\",\n \"tool_choice\",\n ]);\n if (Object.keys(body).some((key) => !allowed.has(key)))\n throw new ProductModelError(\"parameter_unsupported\", 0, false);\n return body;\n },\n metadataExtractor: {\n async extractMetadata({ parsedBody }) {\n return metadata(parsedBody);\n },\n createStreamExtractor() {\n let evidence: ReturnType<typeof metadata>;\n return {\n processChunk(chunk) {\n evidence = metadata(chunk) ?? evidence;\n },\n buildMetadata() {\n return evidence;\n },\n };\n },\n },\n supportsStructuredOutputs: model.capabilities.structuredOutput,\n fetch: async (url, init) => {\n const timeout = AbortSignal.timeout(connection.timeoutMs ?? 60_000);\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", `Bearer ${connection.apiKey}`);\n if (connection.teamId) headers.set(\"X-OpenPond-Team-Id\", connection.teamId);\n return boundProductModelResponse(\n await (connection.fetch ?? fetch)(url, {\n ...init,\n redirect: \"error\",\n headers,\n signal: init?.signal ? AbortSignal.any([init.signal, timeout]) : timeout,\n }),\n );\n },\n }).chatModel(model.id);\n const check = (options: Parameters<typeof provider.doGenerate>[0]) => {\n const rawOptions = options.providerOptions?.openpond;\n if (rawOptions && [\"stream\", \"stream_options\"].some((key) => key in rawOptions))\n throw new ProductModelError(\"transport_override_forbidden\", 0, false);\n if (options.tools?.length && !model.capabilities.tools)\n throw new ProductModelError(\"tools_unsupported\", 0, false);\n if (options.responseFormat?.type === \"json\")\n throw new ProductModelError(\"structured_output_unsupported\", 0, false);\n if (\n options.prompt.some(\n (message) =>\n (message.role === \"tool\" && !model.capabilities.tools) ||\n (message.role !== \"system\" &&\n message.content.some(\n (part) =>\n part.type !== \"text\" &&\n !(model.capabilities.tools && [\"tool-call\", \"tool-result\"].includes(part.type)),\n )),\n )\n )\n throw new ProductModelError(\"input_capability_unsupported\", 0, false);\n };\n // Convert retryable transport errors to a terminal SDK error: AI SDK's default\n // automatic retries must not accidentally duplicate a billed generation.\n const normalizeError = (error: unknown): ProductModelError => {\n if (error instanceof ProductModelError) return error;\n if (\n error &&\n typeof error === \"object\" &&\n \"cause\" in error &&\n error.cause instanceof ProductModelError\n )\n return error.cause;\n const status =\n error &&\n typeof error === \"object\" &&\n \"statusCode\" in error &&\n typeof error.statusCode === \"number\"\n ? error.statusCode\n : 0;\n const unknown =\n status === 0 || status === 408 || status >= 500 || (status >= 200 && status < 300);\n return new ProductModelError(\n status >= 400 ? \"model_request_rejected\" : \"model_outcome_unknown\",\n status,\n unknown,\n );\n };\n return {\n specificationVersion: provider.specificationVersion,\n provider: provider.provider,\n modelId: provider.modelId,\n supportedUrls: provider.supportedUrls,\n async doGenerate(options: Parameters<typeof provider.doGenerate>[0]) {\n check(options);\n try {\n return await provider.doGenerate(options);\n } catch (error) {\n throw normalizeError(error);\n }\n },\n async doStream(options: Parameters<typeof provider.doStream>[0]) {\n check(options);\n if (!model.capabilities.streaming)\n throw new ProductModelError(\"streaming_unsupported\", 0, false);\n try {\n const result = await provider.doStream(options);\n const reader = result.stream.getReader();\n return {\n ...result,\n stream: new ReadableStream({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n reader.releaseLock();\n } else\n controller.enqueue(\n value.type === \"error\"\n ? { ...value, error: normalizeError(value.error) }\n : value,\n );\n } catch (error) {\n controller.error(normalizeError(error));\n }\n },\n async cancel(reason) {\n await reader.cancel(reason);\n },\n }),\n };\n } catch (error) {\n throw normalizeError(error);\n }\n },\n };\n}\n","import { ProductModelError } from \"./product-models.js\";\n\n/** Bound the optional provider's otherwise unbounded parser and require the\n * personalized gateway's terminal marker before treating EOF as completion. */\nexport function boundProductModelResponse(response: Response): Response {\n if (!response.body) return response;\n const streaming = response.headers.get(\"content-type\")?.includes(\"text/event-stream\") ?? false;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let total = 0,\n pending = \"\",\n terminal = false;\n let identity: { id: string; model: string } | undefined;\n const fail = () =>\n new ProductModelError(\n streaming ? \"model_stream_interrupted\" : \"model_response_invalid\",\n response.status,\n true,\n response.headers.get(\"x-openpond-request-id\") ??\n response.headers.get(\"x-request-id\") ??\n undefined,\n );\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n if (streaming && !terminal) throw fail();\n controller.close();\n reader.releaseLock();\n return;\n }\n total += value.byteLength;\n if (total > 8 * 1024 * 1024) throw fail();\n if (streaming) {\n pending = (pending + decoder.decode(value, { stream: true })).replace(/\\r\\n/g, \"\\n\");\n let boundary: number;\n while ((boundary = pending.indexOf(\"\\n\\n\")) >= 0) {\n const frame = pending.slice(0, boundary);\n pending = pending.slice(boundary + 2);\n if (new TextEncoder().encode(frame).length > 1024 * 1024) throw fail();\n const data = frame\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trimStart())\n .join(\"\\n\");\n if (data === \"[DONE]\") terminal = true;\n else if (data) {\n const chunk = JSON.parse(data);\n if (typeof chunk.id === \"string\" && typeof chunk.model === \"string\") {\n if (identity && (chunk.id !== identity.id || chunk.model !== identity.model))\n throw fail();\n identity = { id: chunk.id, model: chunk.model };\n }\n }\n }\n if (new TextEncoder().encode(pending).length > 1024 * 1024) throw fail();\n }\n controller.enqueue(value);\n } catch {\n await reader.cancel().catch(() => {});\n controller.error(fail());\n }\n },\n async cancel(reason) {\n await reader.cancel(reason);\n },\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n"],"mappings":";;;;;;;;AACA;AAAA,EACE;AAAA,OAEK;AACP,SAAS,SAAS;;;ACDX,SAAS,0BAA0B,UAA8B;AACtE,MAAI,CAAC,SAAS,KAAM,QAAO;AAC3B,QAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,GAAG,SAAS,mBAAmB,KAAK;AACzF,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,QAAQ,GACV,UAAU,IACV,WAAW;AACb,MAAI;AACJ,QAAM,OAAO,MACX,IAAI;AAAA,IACF,YAAY,6BAA6B;AAAA,IACzC,SAAS;AAAA,IACT;AAAA,IACA,SAAS,QAAQ,IAAI,uBAAuB,KAC1C,SAAS,QAAQ,IAAI,cAAc,KACnC;AAAA,EACJ;AACF,QAAM,OAAO,IAAI,eAA2B;AAAA,IAC1C,MAAM,KAAK,YAAY;AACrB,UAAI;AACF,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,MAAM;AACR,cAAI,aAAa,CAAC,SAAU,OAAM,KAAK;AACvC,qBAAW,MAAM;AACjB,iBAAO,YAAY;AACnB;AAAA,QACF;AACA,iBAAS,MAAM;AACf,YAAI,QAAQ,IAAI,OAAO,KAAM,OAAM,KAAK;AACxC,YAAI,WAAW;AACb,qBAAW,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,GAAG,QAAQ,SAAS,IAAI;AACnF,cAAI;AACJ,kBAAQ,WAAW,QAAQ,QAAQ,MAAM,MAAM,GAAG;AAChD,kBAAM,QAAQ,QAAQ,MAAM,GAAG,QAAQ;AACvC,sBAAU,QAAQ,MAAM,WAAW,CAAC;AACpC,gBAAI,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE,SAAS,OAAO,KAAM,OAAM,KAAK;AACrE,kBAAM,OAAO,MACV,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,WAAW,OAAO,CAAC,EACzC,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC,EACvC,KAAK,IAAI;AACZ,gBAAI,SAAS,SAAU,YAAW;AAAA,qBACzB,MAAM;AACb,oBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,kBAAI,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,UAAU,UAAU;AACnE,oBAAI,aAAa,MAAM,OAAO,SAAS,MAAM,MAAM,UAAU,SAAS;AACpE,wBAAM,KAAK;AACb,2BAAW,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,MAAM;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AACA,cAAI,IAAI,YAAY,EAAE,OAAO,OAAO,EAAE,SAAS,OAAO,KAAM,OAAM,KAAK;AAAA,QACzE;AACA,mBAAW,QAAQ,KAAK;AAAA,MAC1B,QAAQ;AACN,cAAM,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACpC,mBAAW,MAAM,KAAK,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ;AACnB,YAAM,OAAO,OAAO,MAAM;AAAA,IAC5B;AAAA,EACF,CAAC;AACD,SAAO,IAAI,SAAS,MAAM;AAAA,IACxB,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB,SAAS,SAAS;AAAA,EACpB,CAAC;AACH;;;ADhEA,IAAM,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,YAAY;AACpF,SAAS,SAAS,KAAc;AAC9B,QAAM,QAAQ,SAAS,UAAU,GAAG;AACpC,SAAO,MAAM,UAAU,EAAE,UAAU,MAAM,KAAK,SAAS,IAAI;AAC7D;AAGO,SAAS,UACd,OAIA;AACA,QAAM,aAAa,MAAM,mBAAmB;AAC5C,QAAM,WAAW,uBAAuB;AAAA,IACtC,MAAM;AAAA,IACN,SAAS,qBAAqB,WAAW,OAAQ;AAAA,IACjD,QAAQ,WAAW;AAAA;AAAA;AAAA,IAGnB,cAAc;AAAA,IACd,SAAS,WAAW,SAAS,EAAE,sBAAsB,WAAW,OAAO,IAAI;AAAA,IAC3E,sBAAsB,CAAC,QAAQ;AAC7B,YAAM,OAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAC3C,UAAI,KAAK,UAAU,MAAM;AACvB,cAAM,IAAI,kBAAkB,4BAA4B,GAAG,KAAK;AAClE,YAAM,UAAU,oBAAI,IAAI;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,OAAO,KAAK,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;AACnD,cAAM,IAAI,kBAAkB,yBAAyB,GAAG,KAAK;AAC/D,aAAO;AAAA,IACT;AAAA,IACA,mBAAmB;AAAA,MACjB,MAAM,gBAAgB,EAAE,WAAW,GAAG;AACpC,eAAO,SAAS,UAAU;AAAA,MAC5B;AAAA,MACA,wBAAwB;AACtB,YAAI;AACJ,eAAO;AAAA,UACL,aAAa,OAAO;AAClB,uBAAW,SAAS,KAAK,KAAK;AAAA,UAChC;AAAA,UACA,gBAAgB;AACd,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,2BAA2B,MAAM,aAAa;AAAA,IAC9C,OAAO,OAAO,KAAK,SAAS;AAC1B,YAAM,UAAU,YAAY,QAAQ,WAAW,aAAa,GAAM;AAClE,YAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,cAAQ,IAAI,iBAAiB,UAAU,WAAW,MAAM,EAAE;AAC1D,UAAI,WAAW,OAAQ,SAAQ,IAAI,sBAAsB,WAAW,MAAM;AAC1E,aAAO;AAAA,QACL,OAAO,WAAW,SAAS,OAAO,KAAK;AAAA,UACrC,GAAG;AAAA,UACH,UAAU;AAAA,UACV;AAAA,UACA,QAAQ,MAAM,SAAS,YAAY,IAAI,CAAC,KAAK,QAAQ,OAAO,CAAC,IAAI;AAAA,QACnE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC,EAAE,UAAU,MAAM,EAAE;AACrB,QAAM,QAAQ,CAAC,YAAuD;AACpE,UAAM,aAAa,QAAQ,iBAAiB;AAC5C,QAAI,cAAc,CAAC,UAAU,gBAAgB,EAAE,KAAK,CAAC,QAAQ,OAAO,UAAU;AAC5E,YAAM,IAAI,kBAAkB,gCAAgC,GAAG,KAAK;AACtE,QAAI,QAAQ,OAAO,UAAU,CAAC,MAAM,aAAa;AAC/C,YAAM,IAAI,kBAAkB,qBAAqB,GAAG,KAAK;AAC3D,QAAI,QAAQ,gBAAgB,SAAS;AACnC,YAAM,IAAI,kBAAkB,iCAAiC,GAAG,KAAK;AACvE,QACE,QAAQ,OAAO;AAAA,MACb,CAAC,YACE,QAAQ,SAAS,UAAU,CAAC,MAAM,aAAa,SAC/C,QAAQ,SAAS,YAChB,QAAQ,QAAQ;AAAA,QACd,CAAC,SACC,KAAK,SAAS,UACd,EAAE,MAAM,aAAa,SAAS,CAAC,aAAa,aAAa,EAAE,SAAS,KAAK,IAAI;AAAA,MACjF;AAAA,IACN;AAEA,YAAM,IAAI,kBAAkB,gCAAgC,GAAG,KAAK;AAAA,EACxE;AAGA,QAAM,iBAAiB,CAAC,UAAsC;AAC5D,QAAI,iBAAiB,kBAAmB,QAAO;AAC/C,QACE,SACA,OAAO,UAAU,YACjB,WAAW,SACX,MAAM,iBAAiB;AAEvB,aAAO,MAAM;AACf,UAAM,SACJ,SACA,OAAO,UAAU,YACjB,gBAAgB,SAChB,OAAO,MAAM,eAAe,WACxB,MAAM,aACN;AACN,UAAM,UACJ,WAAW,KAAK,WAAW,OAAO,UAAU,OAAQ,UAAU,OAAO,SAAS;AAChF,WAAO,IAAI;AAAA,MACT,UAAU,MAAM,2BAA2B;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,sBAAsB,SAAS;AAAA,IAC/B,UAAU,SAAS;AAAA,IACnB,SAAS,SAAS;AAAA,IAClB,eAAe,SAAS;AAAA,IACxB,MAAM,WAAW,SAAoD;AACnE,YAAM,OAAO;AACb,UAAI;AACF,eAAO,MAAM,SAAS,WAAW,OAAO;AAAA,MAC1C,SAAS,OAAO;AACd,cAAM,eAAe,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,MAAM,SAAS,SAAkD;AAC/D,YAAM,OAAO;AACb,UAAI,CAAC,MAAM,aAAa;AACtB,cAAM,IAAI,kBAAkB,yBAAyB,GAAG,KAAK;AAC/D,UAAI;AACF,cAAM,SAAS,MAAM,SAAS,SAAS,OAAO;AAC9C,cAAM,SAAS,OAAO,OAAO,UAAU;AACvC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,IAAI,eAAe;AAAA,YACzB,MAAM,KAAK,YAAY;AACrB,kBAAI;AACF,sBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,oBAAI,MAAM;AACR,6BAAW,MAAM;AACjB,yBAAO,YAAY;AAAA,gBACrB;AACE,6BAAW;AAAA,oBACT,MAAM,SAAS,UACX,EAAE,GAAG,OAAO,OAAO,eAAe,MAAM,KAAK,EAAE,IAC/C;AAAA,kBACN;AAAA,cACJ,SAAS,OAAO;AACd,2BAAW,MAAM,eAAe,KAAK,CAAC;AAAA,cACxC;AAAA,YACF;AAAA,YACA,MAAM,OAAO,QAAQ;AACnB,oBAAM,OAAO,OAAO,MAAM;AAAA,YAC5B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,cAAM,eAAe,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -42,12 +42,15 @@ var DatasetTaskIngestionError = class extends Error {
|
|
|
42
42
|
this.code = code;
|
|
43
43
|
this.operationId = operationId;
|
|
44
44
|
this.name = "DatasetTaskIngestionError";
|
|
45
|
-
this.
|
|
45
|
+
this.sourceId = operationId;
|
|
46
|
+
this.outcomeUnknown = status === 0 || status === 408 || status >= 500 || code === "dataset_task_receipt_invalid";
|
|
46
47
|
}
|
|
47
48
|
status;
|
|
48
49
|
code;
|
|
49
50
|
operationId;
|
|
50
51
|
outcomeUnknown;
|
|
52
|
+
/** Reuse this source ID when retrying an uncertain submission. */
|
|
53
|
+
sourceId;
|
|
51
54
|
};
|
|
52
55
|
async function addDatasetTask(config, datasetId, task, options = {}) {
|
|
53
56
|
const url = new URL(config.baseUrl);
|
|
@@ -56,10 +59,15 @@ async function addDatasetTask(config, datasetId, task, options = {}) {
|
|
|
56
59
|
const teamId = Id.parse(config.teamId);
|
|
57
60
|
if (!config.apiKey.trim()) throw new Error("An OpenPond API key is required.");
|
|
58
61
|
const id = z.string().trim().min(1).max(240).parse(datasetId);
|
|
62
|
+
const { id: sourceId, ...content } = task;
|
|
63
|
+
if (sourceId !== void 0 && options.idempotencyKey !== void 0 && sourceId !== options.idempotencyKey)
|
|
64
|
+
throw new Error("task.id and idempotencyKey must identify the same source event.");
|
|
65
|
+
if (options.timeoutMs !== void 0 && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0 || options.timeoutMs > 3e5))
|
|
66
|
+
throw new Error("timeoutMs must be greater than zero and at most 300000.");
|
|
59
67
|
const request = DatasetTaskAppendRequestSchema.parse({
|
|
60
68
|
schemaVersion: "openpond.datasetTaskAppend.v1",
|
|
61
|
-
operationId: options.idempotencyKey ?? crypto.randomUUID(),
|
|
62
|
-
task
|
|
69
|
+
operationId: sourceId ?? options.idempotencyKey ?? crypto.randomUUID(),
|
|
70
|
+
task: content
|
|
63
71
|
});
|
|
64
72
|
assertBoundedTaskJson(request, 128 * 1024);
|
|
65
73
|
let response;
|
|
@@ -69,7 +77,10 @@ async function addDatasetTask(config, datasetId, task, options = {}) {
|
|
|
69
77
|
{
|
|
70
78
|
method: "POST",
|
|
71
79
|
redirect: "error",
|
|
72
|
-
signal: options.signal
|
|
80
|
+
signal: options.timeoutMs === void 0 ? options.signal : AbortSignal.any([
|
|
81
|
+
AbortSignal.timeout(options.timeoutMs),
|
|
82
|
+
...options.signal ? [options.signal] : []
|
|
83
|
+
]),
|
|
73
84
|
headers: {
|
|
74
85
|
Authorization: `Bearer ${config.apiKey}`,
|
|
75
86
|
"X-OpenPond-Team-Id": teamId,
|
|
@@ -93,7 +104,7 @@ async function addDatasetTask(config, datasetId, task, options = {}) {
|
|
|
93
104
|
throw new DatasetTaskIngestionError(
|
|
94
105
|
"Task delivery returned an invalid receipt. Retain the same operation ID before retrying.",
|
|
95
106
|
response.status,
|
|
96
|
-
"dataset_task_receipt_invalid",
|
|
107
|
+
response.ok ? "dataset_task_receipt_invalid" : "dataset_task_request_failed",
|
|
97
108
|
request.operationId
|
|
98
109
|
);
|
|
99
110
|
}
|
|
@@ -137,4 +148,4 @@ export {
|
|
|
137
148
|
addDatasetTask,
|
|
138
149
|
createTaskAdder
|
|
139
150
|
};
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
151
|
+
//# sourceMappingURL=chunk-2OVNKPBZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dataset-task-ingestion.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { assertBoundedTaskJson } from \"@openpond/evals/task-schema\";\nimport { readBoundedJsonResponse } from \"./protocol.js\";\n\nconst Id = z.string().trim().min(1).max(240);\nexport const DatasetTaskInputSchema = z\n .object({\n name: z.string().trim().min(1).max(300),\n input: z.record(z.string(), z.unknown()),\n expectedOutput: z.record(z.string(), z.unknown()).nullable().default(null),\n split: z.enum([\"train\", \"validation\", \"frozen_eval\"]).default(\"validation\"),\n source: z\n .object({\n kind: z.string().trim().min(1).max(100),\n eventId: Id.optional(),\n label: z.string().trim().min(1).max(300).optional(),\n occurredAt: z.iso.datetime().optional(),\n })\n .strict()\n .optional(),\n tags: z.array(Id).max(100).default([]),\n })\n .strict();\nexport const DatasetTaskAppendRequestSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.datasetTaskAppend.v1\"),\n operationId: Id,\n task: DatasetTaskInputSchema,\n })\n .strict();\nexport const DatasetTaskAppendReceiptSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.datasetTaskReceipt.v1\"),\n teamId: Id,\n datasetId: z.string().trim().min(1).max(240),\n taskId: Id,\n operationId: Id,\n receivedAt: z.iso.datetime(),\n revision: z.number().int().positive(),\n state: z.literal(\"saved\"),\n trainingUseAuthorized: z.literal(false),\n })\n .strict();\n/** Source identity, distinct from the server's canonical taskId. */\nexport type DatasetTaskInput = z.input<typeof DatasetTaskInputSchema> & { id?: string };\nexport type DatasetTaskAppendReceipt = z.infer<typeof DatasetTaskAppendReceiptSchema>;\nexport type AddTaskOptions = {\n /** Prefer task.id. Retained for existing callers; conflicting IDs are rejected. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n timeoutMs?: number;\n};\nexport type DatasetTaskClientOptions = {\n apiKey: string;\n baseUrl: string;\n teamId: string;\n fetch?: typeof fetch;\n};\n\nexport class DatasetTaskIngestionError extends Error {\n readonly outcomeUnknown: boolean;\n /** Reuse this source ID when retrying an uncertain submission. */\n readonly sourceId: string;\n constructor(\n message: string,\n readonly status: number,\n readonly code: string,\n readonly operationId: string,\n ) {\n super(message);\n this.name = \"DatasetTaskIngestionError\";\n this.sourceId = operationId;\n this.outcomeUnknown =\n status === 0 || status === 408 || status >= 500 || code === \"dataset_task_receipt_invalid\";\n }\n}\n\n/** A bounded append, independent of complete workspace downloads or replacement. */\nexport async function addDatasetTask(\n config: DatasetTaskClientOptions,\n datasetId: string,\n task: DatasetTaskInput,\n options: AddTaskOptions = {},\n): Promise<DatasetTaskAppendReceipt> {\n const url = new URL(config.baseUrl);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n url.pathname !== \"/\"\n )\n throw new Error(\"A clean API origin is required.\");\n const teamId = Id.parse(config.teamId);\n if (!config.apiKey.trim()) throw new Error(\"An OpenPond API key is required.\");\n const id = z.string().trim().min(1).max(240).parse(datasetId);\n const { id: sourceId, ...content } = task;\n if (\n sourceId !== undefined &&\n options.idempotencyKey !== undefined &&\n sourceId !== options.idempotencyKey\n )\n throw new Error(\"task.id and idempotencyKey must identify the same source event.\");\n if (\n options.timeoutMs !== undefined &&\n (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0 || options.timeoutMs > 300_000)\n )\n throw new Error(\"timeoutMs must be greater than zero and at most 300000.\");\n const request = DatasetTaskAppendRequestSchema.parse({\n schemaVersion: \"openpond.datasetTaskAppend.v1\",\n operationId: sourceId ?? options.idempotencyKey ?? crypto.randomUUID(),\n task: content,\n });\n assertBoundedTaskJson(request, 128 * 1024);\n let response: Response;\n try {\n response = await (config.fetch ?? fetch)(\n `${url.origin}/v1/dataset-workspaces/${encodeURIComponent(id)}/tasks`,\n {\n method: \"POST\",\n redirect: \"error\",\n signal:\n options.timeoutMs === undefined\n ? options.signal\n : AbortSignal.any([\n AbortSignal.timeout(options.timeoutMs),\n ...(options.signal ? [options.signal] : []),\n ]),\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"X-OpenPond-Team-Id\": teamId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n },\n );\n } catch {\n throw new DatasetTaskIngestionError(\n \"Task delivery could not be confirmed. Retry with the same operation ID.\",\n 0,\n \"dataset_task_outcome_unknown\",\n request.operationId,\n );\n }\n // HTTP rejection establishes a known outcome even when its error body is malformed.\n let raw: unknown;\n try {\n raw = await readBoundedJsonResponse(response, 64 * 1024, \"Dataset task receipt\");\n } catch {\n throw new DatasetTaskIngestionError(\n \"Task delivery returned an invalid receipt. Retain the same operation ID before retrying.\",\n response.status,\n response.ok ? \"dataset_task_receipt_invalid\" : \"dataset_task_request_failed\",\n request.operationId,\n );\n }\n if (!response.ok) {\n const error = z\n .object({ message: z.string().optional(), code: z.string().optional() })\n .passthrough()\n .safeParse(raw);\n throw new DatasetTaskIngestionError(\n error.success ? (error.data.message ?? \"Task submission failed.\") : \"Task submission failed.\",\n response.status,\n error.success\n ? (error.data.code ?? \"dataset_task_request_failed\")\n : \"dataset_task_request_failed\",\n request.operationId,\n );\n }\n const parsed = DatasetTaskAppendReceiptSchema.safeParse(raw);\n if (!parsed.success)\n throw new DatasetTaskIngestionError(\n \"Task delivery returned an invalid receipt.\",\n response.status,\n \"dataset_task_receipt_invalid\",\n request.operationId,\n );\n const receipt = parsed.data;\n if (\n receipt.teamId !== teamId ||\n receipt.datasetId !== id ||\n receipt.operationId !== request.operationId\n )\n throw new DatasetTaskIngestionError(\n \"Dataset task receipt identity mismatch.\",\n response.status,\n \"dataset_task_receipt_invalid\",\n request.operationId,\n );\n return receipt;\n}\n\n/** Bind credentials and destination once; the returned addTask has no global state. */\nexport function createTaskAdder(config: DatasetTaskClientOptions & { datasetId: string }) {\n const { datasetId, ...connection } = config;\n return (task: DatasetTaskInput, options?: AddTaskOptions) =>\n addDatasetTask(connection, datasetId, task, options);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
GeneratedTaskFileSchema,
|
|
3
3
|
TasksetReadinessReportSchema,
|
|
4
4
|
TrainingPathRecommendationSchema
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-RTLJV4OS.js";
|
|
6
6
|
import {
|
|
7
7
|
GraderFixtureLabelSchema,
|
|
8
8
|
GraderSpecSchema,
|
|
9
9
|
TaskPolicyBoundarySchema,
|
|
10
10
|
TasksetCapabilityManifestSchema,
|
|
11
11
|
TasksetSplitSchema
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GV6DEDBU.js";
|
|
13
13
|
|
|
14
14
|
// src/task-design-contracts.ts
|
|
15
15
|
import { z } from "zod";
|
|
@@ -97,4 +97,4 @@ export {
|
|
|
97
97
|
TaskExampleProposalSchema,
|
|
98
98
|
TaskDesignProposalSchema
|
|
99
99
|
};
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
100
|
+
//# sourceMappingURL=chunk-3G3HUA32.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
TasksetPackageSchema,
|
|
4
4
|
tasksetPackageRewardBinding,
|
|
5
5
|
validateTasksetPackage
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GV6DEDBU.js";
|
|
7
7
|
import {
|
|
8
8
|
TasksetCatalogReleaseRefSchema
|
|
9
9
|
} from "./chunk-Z252BNAZ.js";
|
|
@@ -188,4 +188,4 @@ export {
|
|
|
188
188
|
OpenPondTasksetPackageError,
|
|
189
189
|
OpenPondTasksetPackageClient
|
|
190
190
|
};
|
|
191
|
-
//# sourceMappingURL=chunk-
|
|
191
|
+
//# sourceMappingURL=chunk-3MWFN7BA.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
fetchConnectedJson
|
|
3
|
+
} from "./chunk-O6FKHAWN.js";
|
|
1
4
|
import {
|
|
2
5
|
AgentImportCommitRequestSchema,
|
|
3
6
|
AgentImportPreviewRequestSchema,
|
|
@@ -8,10 +11,7 @@ import {
|
|
|
8
11
|
ConnectedStartingAssetsRequestSchema,
|
|
9
12
|
DatasetWorkspaceReceiptSchema,
|
|
10
13
|
verifyConnectedStartingAssetsReceipt
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import {
|
|
13
|
-
fetchConnectedJson
|
|
14
|
-
} from "./chunk-O6FKHAWN.js";
|
|
14
|
+
} from "./chunk-YS7DF76T.js";
|
|
15
15
|
import {
|
|
16
16
|
ImmutableReleaseRefSchema,
|
|
17
17
|
contentHash
|
|
@@ -650,4 +650,4 @@ export {
|
|
|
650
650
|
summarizeCollectorCoverage2 as summarizeCollectorCoverage,
|
|
651
651
|
hashCollectorEligibleBoundaries
|
|
652
652
|
};
|
|
653
|
-
//# sourceMappingURL=chunk-
|
|
653
|
+
//# sourceMappingURL=chunk-47THZRUM.js.map
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readBoundedJsonResponse
|
|
3
|
+
} from "./chunk-B3ZHJ2KK.js";
|
|
4
|
+
|
|
5
|
+
// src/product-models.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
var ProductModelError = class extends Error {
|
|
8
|
+
constructor(code, status, outcomeUnknown, requestId) {
|
|
9
|
+
super(`OpenPond model request failed (${code}).`);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.outcomeUnknown = outcomeUnknown;
|
|
13
|
+
this.requestId = requestId;
|
|
14
|
+
this.name = "ProductModelError";
|
|
15
|
+
}
|
|
16
|
+
code;
|
|
17
|
+
status;
|
|
18
|
+
outcomeUnknown;
|
|
19
|
+
requestId;
|
|
20
|
+
};
|
|
21
|
+
var Message = z.object({ role: z.enum(["system", "user", "assistant"]), content: z.string().max(2e5) }).strict();
|
|
22
|
+
var Input = z.object({
|
|
23
|
+
prompt: z.string().max(2e5).optional(),
|
|
24
|
+
messages: z.array(Message).min(1).max(128).optional(),
|
|
25
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
26
|
+
maxTokens: z.number().int().min(1).max(4096).optional()
|
|
27
|
+
}).strict().refine(
|
|
28
|
+
(v) => v.prompt !== void 0 !== (v.messages !== void 0),
|
|
29
|
+
"Supply prompt or messages, exclusively."
|
|
30
|
+
);
|
|
31
|
+
var Usage = z.object({
|
|
32
|
+
prompt_tokens: z.number().int().nonnegative(),
|
|
33
|
+
completion_tokens: z.number().int().nonnegative(),
|
|
34
|
+
total_tokens: z.number().int().nonnegative()
|
|
35
|
+
});
|
|
36
|
+
var Chunk = z.object({
|
|
37
|
+
id: z.string(),
|
|
38
|
+
model: z.string(),
|
|
39
|
+
system_fingerprint: z.string().nullable().optional(),
|
|
40
|
+
openpond: z.record(z.string(), z.json()).optional(),
|
|
41
|
+
usage: Usage.nullable().optional(),
|
|
42
|
+
choices: z.array(
|
|
43
|
+
z.object({
|
|
44
|
+
index: z.number().int(),
|
|
45
|
+
finish_reason: z.string().nullable().optional(),
|
|
46
|
+
delta: z.object({ content: z.string().nullable().optional(), tool_calls: z.unknown().optional() }).passthrough().optional(),
|
|
47
|
+
message: z.object({ content: z.string().nullable(), tool_calls: z.unknown().optional() }).passthrough().optional()
|
|
48
|
+
})
|
|
49
|
+
).max(1)
|
|
50
|
+
});
|
|
51
|
+
function productModelEndpoint(value) {
|
|
52
|
+
const url = new URL(value);
|
|
53
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
54
|
+
throw new Error("A clean serving base URL is required.");
|
|
55
|
+
return url.href.replace(/\/$/, "");
|
|
56
|
+
}
|
|
57
|
+
var ProductModel = class {
|
|
58
|
+
constructor(binding, connection) {
|
|
59
|
+
this.connection = connection;
|
|
60
|
+
this.id = z.string().trim().regex(/^[a-z0-9][a-z0-9._:-]{2,127}$/).parse(typeof binding === "string" ? binding : binding.id);
|
|
61
|
+
this.capabilities = {
|
|
62
|
+
streaming: true,
|
|
63
|
+
tools: false,
|
|
64
|
+
structuredOutput: false,
|
|
65
|
+
...typeof binding === "string" ? {} : binding.capabilities
|
|
66
|
+
};
|
|
67
|
+
if (!connection.baseUrl || !connection.apiKey.trim())
|
|
68
|
+
throw new Error("Named models require an explicit serving.baseUrl and API key.");
|
|
69
|
+
productModelEndpoint(connection.baseUrl);
|
|
70
|
+
if (connection.timeoutMs !== void 0 && (!Number.isFinite(connection.timeoutMs) || connection.timeoutMs <= 0 || connection.timeoutMs > 3e5))
|
|
71
|
+
throw new Error("Serving timeoutMs must be greater than zero and at most 300000.");
|
|
72
|
+
}
|
|
73
|
+
connection;
|
|
74
|
+
id;
|
|
75
|
+
capabilities;
|
|
76
|
+
/** Provider integrations use the same exact destination and transport. */
|
|
77
|
+
providerConnection() {
|
|
78
|
+
return { ...this.connection };
|
|
79
|
+
}
|
|
80
|
+
async request(input, stream) {
|
|
81
|
+
if (stream && !this.capabilities.streaming)
|
|
82
|
+
throw new ProductModelError("streaming_unsupported", 0, false);
|
|
83
|
+
const { signal, ...raw } = input;
|
|
84
|
+
const parsed = Input.parse(raw);
|
|
85
|
+
const body = JSON.stringify({
|
|
86
|
+
model: this.id,
|
|
87
|
+
messages: parsed.messages ?? [{ role: "user", content: parsed.prompt }],
|
|
88
|
+
...parsed.temperature === void 0 ? {} : { temperature: parsed.temperature },
|
|
89
|
+
...parsed.maxTokens === void 0 ? {} : { max_tokens: parsed.maxTokens },
|
|
90
|
+
stream
|
|
91
|
+
});
|
|
92
|
+
if (new TextEncoder().encode(body).length > 1024 * 1024)
|
|
93
|
+
throw new ProductModelError("payload_too_large", 0, false);
|
|
94
|
+
const deadline = AbortSignal.timeout(this.connection.timeoutMs ?? 6e4);
|
|
95
|
+
let response;
|
|
96
|
+
try {
|
|
97
|
+
response = await (this.connection.fetch ?? fetch)(
|
|
98
|
+
`${productModelEndpoint(this.connection.baseUrl)}/chat/completions`,
|
|
99
|
+
{
|
|
100
|
+
method: "POST",
|
|
101
|
+
redirect: "error",
|
|
102
|
+
headers: {
|
|
103
|
+
Authorization: `Bearer ${this.connection.apiKey}`,
|
|
104
|
+
...this.connection.teamId ? { "X-OpenPond-Team-Id": this.connection.teamId } : {},
|
|
105
|
+
"Content-Type": "application/json",
|
|
106
|
+
Accept: stream ? "text/event-stream" : "application/json"
|
|
107
|
+
},
|
|
108
|
+
body,
|
|
109
|
+
signal: signal ? AbortSignal.any([signal, deadline]) : deadline
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
} catch {
|
|
113
|
+
throw new ProductModelError("model_outcome_unknown", 0, true);
|
|
114
|
+
}
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
await response.body?.cancel();
|
|
117
|
+
throw new ProductModelError(
|
|
118
|
+
"model_request_rejected",
|
|
119
|
+
response.status,
|
|
120
|
+
response.status >= 500,
|
|
121
|
+
response.headers.get("x-openpond-request-id") ?? response.headers.get("x-request-id") ?? void 0
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
return response;
|
|
125
|
+
}
|
|
126
|
+
async generate(input) {
|
|
127
|
+
const response = await this.request(input, false);
|
|
128
|
+
try {
|
|
129
|
+
const chunk = Chunk.parse(
|
|
130
|
+
await readBoundedJsonResponse(response, 8 * 1024 * 1024, "Model result")
|
|
131
|
+
);
|
|
132
|
+
if (chunk.choices.length !== 1 || !chunk.choices[0].message || chunk.choices[0].message.tool_calls)
|
|
133
|
+
throw new Error("Unsupported response");
|
|
134
|
+
return this.result(
|
|
135
|
+
chunk,
|
|
136
|
+
chunk.choices[0].message.content ?? "",
|
|
137
|
+
chunk.choices[0].finish_reason ?? null,
|
|
138
|
+
response
|
|
139
|
+
);
|
|
140
|
+
} catch {
|
|
141
|
+
throw new ProductModelError(
|
|
142
|
+
"model_response_invalid",
|
|
143
|
+
response.status,
|
|
144
|
+
true,
|
|
145
|
+
response.headers.get("x-openpond-request-id") ?? response.headers.get("x-request-id") ?? void 0
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
result(chunk, text, finishReason, response) {
|
|
150
|
+
return {
|
|
151
|
+
text,
|
|
152
|
+
requestId: response.headers.get("x-openpond-request-id") ?? response.headers.get("x-request-id") ?? chunk.id,
|
|
153
|
+
modelId: this.id,
|
|
154
|
+
resolvedModelId: chunk.model,
|
|
155
|
+
finishReason,
|
|
156
|
+
usage: chunk.usage ? {
|
|
157
|
+
inputTokens: chunk.usage.prompt_tokens,
|
|
158
|
+
outputTokens: chunk.usage.completion_tokens,
|
|
159
|
+
totalTokens: chunk.usage.total_tokens
|
|
160
|
+
} : null,
|
|
161
|
+
systemFingerprint: chunk.system_fingerprint ?? null,
|
|
162
|
+
evidence: chunk.openpond ?? null
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Breaking iteration cancels the HTTP body. A truncated stream never produces finish. */
|
|
166
|
+
async *stream(input) {
|
|
167
|
+
const response = await this.request(input, true);
|
|
168
|
+
if (!response.headers.get("content-type")?.includes("text/event-stream") || !response.body) {
|
|
169
|
+
await response.body?.cancel();
|
|
170
|
+
throw new ProductModelError("model_stream_invalid", response.status, true);
|
|
171
|
+
}
|
|
172
|
+
const reader = response.body.getReader();
|
|
173
|
+
const decoder = new TextDecoder();
|
|
174
|
+
let buffer = "", text = "", finish = null, last;
|
|
175
|
+
let usage = null;
|
|
176
|
+
let outputBytes = 0;
|
|
177
|
+
try {
|
|
178
|
+
for (; ; ) {
|
|
179
|
+
const { done, value } = await reader.read();
|
|
180
|
+
buffer = (buffer + decoder.decode(value, { stream: !done })).replace(/\r\n/g, "\n");
|
|
181
|
+
if (new TextEncoder().encode(buffer).length > 1024 * 1024)
|
|
182
|
+
throw new Error("Stream frame too large");
|
|
183
|
+
let boundary;
|
|
184
|
+
while ((boundary = buffer.indexOf("\n\n")) >= 0) {
|
|
185
|
+
const frame = buffer.slice(0, boundary);
|
|
186
|
+
buffer = buffer.slice(boundary + 2);
|
|
187
|
+
const data = frame.split("\n").filter((line) => line.startsWith("data:")).map((line) => line.slice(5).trimStart()).join("\n");
|
|
188
|
+
if (!data) continue;
|
|
189
|
+
if (data === "[DONE]") {
|
|
190
|
+
if (!last || !finish) throw new Error("Incomplete stream");
|
|
191
|
+
yield {
|
|
192
|
+
type: "finish",
|
|
193
|
+
result: this.result({ ...last, usage }, text, finish, response)
|
|
194
|
+
};
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const chunk = Chunk.parse(JSON.parse(data));
|
|
198
|
+
if (last && (last.id !== chunk.id || last.model !== chunk.model))
|
|
199
|
+
throw new Error("Stream identity changed");
|
|
200
|
+
last = chunk;
|
|
201
|
+
if (chunk.usage) usage = chunk.usage;
|
|
202
|
+
const choice = chunk.choices[0];
|
|
203
|
+
if (choice?.delta?.tool_calls) throw new Error("Tool output unsupported by text API");
|
|
204
|
+
if (choice?.finish_reason) finish = choice.finish_reason;
|
|
205
|
+
const delta = choice?.delta?.content;
|
|
206
|
+
if (delta) {
|
|
207
|
+
text += delta;
|
|
208
|
+
outputBytes += new TextEncoder().encode(delta).length;
|
|
209
|
+
if (outputBytes > 8 * 1024 * 1024) throw new Error("Model output too large");
|
|
210
|
+
yield { type: "text", text: delta };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (done) throw new Error("Stream ended before DONE");
|
|
214
|
+
}
|
|
215
|
+
} catch (error) {
|
|
216
|
+
if (error instanceof ProductModelError) throw error;
|
|
217
|
+
throw new ProductModelError(
|
|
218
|
+
"model_stream_interrupted",
|
|
219
|
+
response.status,
|
|
220
|
+
true,
|
|
221
|
+
response.headers.get("x-openpond-request-id") ?? response.headers.get("x-request-id") ?? void 0
|
|
222
|
+
);
|
|
223
|
+
} finally {
|
|
224
|
+
await reader.cancel().catch(() => {
|
|
225
|
+
});
|
|
226
|
+
reader.releaseLock();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
function createProductModels(bindings, connection) {
|
|
231
|
+
return Object.fromEntries(
|
|
232
|
+
Object.entries(bindings).map(([name, binding]) => [
|
|
233
|
+
name,
|
|
234
|
+
new ProductModel(binding, connection)
|
|
235
|
+
])
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export {
|
|
240
|
+
ProductModelError,
|
|
241
|
+
productModelEndpoint,
|
|
242
|
+
ProductModel,
|
|
243
|
+
createProductModels
|
|
244
|
+
};
|
|
245
|
+
//# sourceMappingURL=chunk-BRP3EBCR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/product-models.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { readBoundedJsonResponse } from \"./protocol.js\";\n\nexport type ProductModelBinding = {\n id: string;\n capabilities?: { streaming?: boolean; tools?: boolean; structuredOutput?: false };\n};\nexport type ProductModelMessage = { role: \"system\" | \"user\" | \"assistant\"; content: string };\nexport type ProductModelInput = {\n prompt?: string;\n messages?: ProductModelMessage[];\n temperature?: number;\n maxTokens?: number;\n signal?: AbortSignal;\n};\nexport type ProductModelUsage = { inputTokens: number; outputTokens: number; totalTokens: number };\nexport type ProductModelResult = {\n text: string;\n requestId: string;\n modelId: string;\n resolvedModelId: string;\n finishReason: string | null;\n usage: ProductModelUsage | null;\n systemFingerprint: string | null;\n /** Retained server evidence; presence alone is not client-side verification. */\n evidence: Record<string, unknown> | null;\n};\nexport type ProductModelEvent =\n | { type: \"text\"; text: string }\n | { type: \"finish\"; result: ProductModelResult };\nexport type ProductModelConnection = {\n baseUrl?: string;\n teamId?: string;\n apiKey: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n};\nexport type ProductModels<Models> = { readonly [Name in keyof Models]: ProductModel };\n\nexport class ProductModelError extends Error {\n constructor(\n readonly code: string,\n readonly status: number,\n readonly outcomeUnknown: boolean,\n readonly requestId?: string,\n ) {\n super(`OpenPond model request failed (${code}).`);\n this.name = \"ProductModelError\";\n }\n}\nconst Message = z\n .object({ role: z.enum([\"system\", \"user\", \"assistant\"]), content: z.string().max(200_000) })\n .strict();\nconst Input = z\n .object({\n prompt: z.string().max(200_000).optional(),\n messages: z.array(Message).min(1).max(128).optional(),\n temperature: z.number().min(0).max(2).optional(),\n maxTokens: z.number().int().min(1).max(4096).optional(),\n })\n .strict()\n .refine(\n (v) => (v.prompt !== undefined) !== (v.messages !== undefined),\n \"Supply prompt or messages, exclusively.\",\n );\nconst Usage = z.object({\n prompt_tokens: z.number().int().nonnegative(),\n completion_tokens: z.number().int().nonnegative(),\n total_tokens: z.number().int().nonnegative(),\n});\nconst Chunk = z.object({\n id: z.string(),\n model: z.string(),\n system_fingerprint: z.string().nullable().optional(),\n openpond: z.record(z.string(), z.json()).optional(),\n usage: Usage.nullable().optional(),\n choices: z\n .array(\n z.object({\n index: z.number().int(),\n finish_reason: z.string().nullable().optional(),\n delta: z\n .object({ content: z.string().nullable().optional(), tool_calls: z.unknown().optional() })\n .passthrough()\n .optional(),\n message: z\n .object({ content: z.string().nullable(), tool_calls: z.unknown().optional() })\n .passthrough()\n .optional(),\n }),\n )\n .max(1),\n});\n\nexport function productModelEndpoint(value: string): string {\n const url = new URL(value);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash\n )\n throw new Error(\"A clean serving base URL is required.\");\n return url.href.replace(/\\/$/, \"\");\n}\n\n/** A named text model. This never resolves a catalogue default or activates serving. */\nexport class ProductModel {\n readonly id: string;\n readonly capabilities: Required<NonNullable<ProductModelBinding[\"capabilities\"]>>;\n constructor(\n binding: string | ProductModelBinding,\n private readonly connection: ProductModelConnection,\n ) {\n this.id = z\n .string()\n .trim()\n .regex(/^[a-z0-9][a-z0-9._:-]{2,127}$/)\n .parse(typeof binding === \"string\" ? binding : binding.id);\n this.capabilities = {\n streaming: true,\n tools: false,\n structuredOutput: false,\n ...(typeof binding === \"string\" ? {} : binding.capabilities),\n };\n if (!connection.baseUrl || !connection.apiKey.trim())\n throw new Error(\"Named models require an explicit serving.baseUrl and API key.\");\n productModelEndpoint(connection.baseUrl);\n if (\n connection.timeoutMs !== undefined &&\n (!Number.isFinite(connection.timeoutMs) ||\n connection.timeoutMs <= 0 ||\n connection.timeoutMs > 300_000)\n )\n throw new Error(\"Serving timeoutMs must be greater than zero and at most 300000.\");\n }\n /** Provider integrations use the same exact destination and transport. */\n providerConnection(): Readonly<ProductModelConnection> {\n return { ...this.connection };\n }\n private async request(input: ProductModelInput, stream: boolean): Promise<Response> {\n if (stream && !this.capabilities.streaming)\n throw new ProductModelError(\"streaming_unsupported\", 0, false);\n const { signal, ...raw } = input;\n const parsed = Input.parse(raw);\n const body = JSON.stringify({\n model: this.id,\n messages: parsed.messages ?? [{ role: \"user\", content: parsed.prompt }],\n ...(parsed.temperature === undefined ? {} : { temperature: parsed.temperature }),\n ...(parsed.maxTokens === undefined ? {} : { max_tokens: parsed.maxTokens }),\n stream,\n });\n if (new TextEncoder().encode(body).length > 1024 * 1024)\n throw new ProductModelError(\"payload_too_large\", 0, false);\n const deadline = AbortSignal.timeout(this.connection.timeoutMs ?? 60_000);\n let response: Response;\n try {\n response = await (this.connection.fetch ?? fetch)(\n `${productModelEndpoint(this.connection.baseUrl!)}/chat/completions`,\n {\n method: \"POST\",\n redirect: \"error\",\n headers: {\n Authorization: `Bearer ${this.connection.apiKey}`,\n ...(this.connection.teamId ? { \"X-OpenPond-Team-Id\": this.connection.teamId } : {}),\n \"Content-Type\": \"application/json\",\n Accept: stream ? \"text/event-stream\" : \"application/json\",\n },\n body,\n signal: signal ? AbortSignal.any([signal, deadline]) : deadline,\n },\n );\n } catch {\n throw new ProductModelError(\"model_outcome_unknown\", 0, true);\n }\n if (!response.ok) {\n await response.body?.cancel();\n throw new ProductModelError(\n \"model_request_rejected\",\n response.status,\n response.status >= 500,\n response.headers.get(\"x-openpond-request-id\") ??\n response.headers.get(\"x-request-id\") ??\n undefined,\n );\n }\n return response;\n }\n async generate(input: ProductModelInput): Promise<ProductModelResult> {\n const response = await this.request(input, false);\n try {\n const chunk = Chunk.parse(\n await readBoundedJsonResponse(response, 8 * 1024 * 1024, \"Model result\"),\n );\n if (\n chunk.choices.length !== 1 ||\n !chunk.choices[0].message ||\n chunk.choices[0].message.tool_calls\n )\n throw new Error(\"Unsupported response\");\n return this.result(\n chunk,\n chunk.choices[0].message.content ?? \"\",\n chunk.choices[0].finish_reason ?? null,\n response,\n );\n } catch {\n throw new ProductModelError(\n \"model_response_invalid\",\n response.status,\n true,\n response.headers.get(\"x-openpond-request-id\") ??\n response.headers.get(\"x-request-id\") ??\n undefined,\n );\n }\n }\n private result(\n chunk: z.infer<typeof Chunk>,\n text: string,\n finishReason: string | null,\n response: Response,\n ): ProductModelResult {\n return {\n text,\n requestId:\n response.headers.get(\"x-openpond-request-id\") ??\n response.headers.get(\"x-request-id\") ??\n chunk.id,\n modelId: this.id,\n resolvedModelId: chunk.model,\n finishReason,\n usage: chunk.usage\n ? {\n inputTokens: chunk.usage.prompt_tokens,\n outputTokens: chunk.usage.completion_tokens,\n totalTokens: chunk.usage.total_tokens,\n }\n : null,\n systemFingerprint: chunk.system_fingerprint ?? null,\n evidence: chunk.openpond ?? null,\n };\n }\n /** Breaking iteration cancels the HTTP body. A truncated stream never produces finish. */\n async *stream(input: ProductModelInput): AsyncGenerator<ProductModelEvent> {\n const response = await this.request(input, true);\n if (!response.headers.get(\"content-type\")?.includes(\"text/event-stream\") || !response.body) {\n await response.body?.cancel();\n throw new ProductModelError(\"model_stream_invalid\", response.status, true);\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\",\n text = \"\",\n finish: string | null = null,\n last: z.infer<typeof Chunk> | undefined;\n let usage: z.infer<typeof Usage> | null = null;\n let outputBytes = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n buffer = (buffer + decoder.decode(value, { stream: !done })).replace(/\\r\\n/g, \"\\n\");\n if (new TextEncoder().encode(buffer).length > 1024 * 1024)\n throw new Error(\"Stream frame too large\");\n let boundary: number;\n while ((boundary = buffer.indexOf(\"\\n\\n\")) >= 0) {\n const frame = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const data = frame\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trimStart())\n .join(\"\\n\");\n if (!data) continue;\n if (data === \"[DONE]\") {\n if (!last || !finish) throw new Error(\"Incomplete stream\");\n yield {\n type: \"finish\",\n result: this.result({ ...last, usage }, text, finish, response),\n };\n return;\n }\n const chunk = Chunk.parse(JSON.parse(data));\n if (last && (last.id !== chunk.id || last.model !== chunk.model))\n throw new Error(\"Stream identity changed\");\n last = chunk;\n if (chunk.usage) usage = chunk.usage;\n const choice = chunk.choices[0];\n if (choice?.delta?.tool_calls) throw new Error(\"Tool output unsupported by text API\");\n if (choice?.finish_reason) finish = choice.finish_reason;\n const delta = choice?.delta?.content;\n if (delta) {\n text += delta;\n outputBytes += new TextEncoder().encode(delta).length;\n if (outputBytes > 8 * 1024 * 1024) throw new Error(\"Model output too large\");\n yield { type: \"text\", text: delta };\n }\n }\n if (done) throw new Error(\"Stream ended before DONE\");\n }\n } catch (error) {\n if (error instanceof ProductModelError) throw error;\n throw new ProductModelError(\n \"model_stream_interrupted\",\n response.status,\n true,\n response.headers.get(\"x-openpond-request-id\") ??\n response.headers.get(\"x-request-id\") ??\n undefined,\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n }\n}\nexport function createProductModels<\n const Models extends Record<string, string | ProductModelBinding>,\n>(bindings: Models, connection: ProductModelConnection): ProductModels<Models> {\n return Object.fromEntries(\n Object.entries(bindings).map(([name, binding]) => [\n name,\n new ProductModel(binding, connection),\n ]),\n ) as ProductModels<Models>;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
publishTasksetDraft,
|
|
5
5
|
renderTasksetDraftManifests,
|
|
6
6
|
validateTasksetDraftWorkspace
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JOMZJXGC.js";
|
|
8
8
|
import {
|
|
9
9
|
materializePortableTasksetRelease,
|
|
10
10
|
portableTasksetEnvironment,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
TasksetSchema,
|
|
15
15
|
computeTasksetHash
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-RTLJV4OS.js";
|
|
17
17
|
import {
|
|
18
18
|
MAX_TASKSET_PACKAGE_BYTES,
|
|
19
19
|
ModelStarterExecutionSchema,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
resolveTasksetPackageInstructions,
|
|
33
33
|
structuredSamplingSchemaDeclaration,
|
|
34
34
|
validateTasksetPackage
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-GV6DEDBU.js";
|
|
36
36
|
import {
|
|
37
37
|
ModelTasksetAuthoringOwnerSchema,
|
|
38
38
|
ModelTasksetDraftPreparationSchema,
|
|
@@ -471,4 +471,4 @@ export {
|
|
|
471
471
|
compileTasksetDraftWorkspace,
|
|
472
472
|
compileModelTasksetDraftWorkspace
|
|
473
473
|
};
|
|
474
|
-
//# sourceMappingURL=chunk-
|
|
474
|
+
//# sourceMappingURL=chunk-DDCR4KB5.js.map
|
|
@@ -8,14 +8,14 @@ import {
|
|
|
8
8
|
ModelProjectVersionedRefSchema
|
|
9
9
|
} from "./chunk-MVAEE5EI.js";
|
|
10
10
|
import {
|
|
11
|
-
canonicalJson
|
|
11
|
+
canonicalJson
|
|
12
12
|
} from "./chunk-B3ZHJ2KK.js";
|
|
13
13
|
import {
|
|
14
14
|
ImmutableAssetRefSchema,
|
|
15
15
|
ImmutableReleaseRefSchema,
|
|
16
16
|
ReleaseHashSchema,
|
|
17
17
|
ReleaseIdSchema,
|
|
18
|
-
canonicalJson,
|
|
18
|
+
canonicalJson as canonicalJson2,
|
|
19
19
|
contentHash,
|
|
20
20
|
sha256,
|
|
21
21
|
sha256Hex
|
|
@@ -7545,7 +7545,7 @@ function projectStructuredSamplingSchema(full, declarationInput) {
|
|
|
7545
7545
|
const declaration = StructuredSamplingSchemaDeclarationSchema.parse(declarationInput);
|
|
7546
7546
|
if (declaration.validationSchemaHash !== full.schemaHash)
|
|
7547
7547
|
throw new Error("structured_sampling_validation_identity_changed");
|
|
7548
|
-
if (sha256Hex(full.schemaSource) !== full.schemaHash ||
|
|
7548
|
+
if (sha256Hex(full.schemaSource) !== full.schemaHash || canonicalJson2(JSON.parse(full.schemaSource)) !== canonicalJson2(full.schema))
|
|
7549
7549
|
throw new Error("structured_sampling_validation_source_changed");
|
|
7550
7550
|
const result = JSON.parse(full.schemaSource);
|
|
7551
7551
|
const targets = /* @__PURE__ */ new Map();
|
|
@@ -7587,7 +7587,7 @@ function assertStructuredSamplingSchema(full, input) {
|
|
|
7587
7587
|
const sampling = StructuredSamplingSchemaContractSchema.parse(input);
|
|
7588
7588
|
const derived = projectStructuredSamplingSchema(full, sampling.declaration);
|
|
7589
7589
|
const expectedSource = JSON.stringify(derived);
|
|
7590
|
-
if (sampling.schemaSource !== expectedSource ||
|
|
7590
|
+
if (sampling.schemaSource !== expectedSource || canonicalJson2(sampling.schema) !== canonicalJson2(derived) || sha256Hex(expectedSource) !== sampling.schemaHash || sampling.schemaHash !== sampling.declaration.schemaRef.contentHash || new TextEncoder().encode(expectedSource).byteLength !== sampling.declaration.schemaRef.sizeBytes) {
|
|
7591
7591
|
throw new Error("structured_sampling_schema_identity_changed");
|
|
7592
7592
|
}
|
|
7593
7593
|
}
|
|
@@ -7695,7 +7695,7 @@ function resolveStructuredOutput(schemaBytes, expectedHash) {
|
|
|
7695
7695
|
}
|
|
7696
7696
|
function assertStructuredOutputContract(contract) {
|
|
7697
7697
|
assertStructuredOutputSchema(contract.schema);
|
|
7698
|
-
if (sha256Hex(new TextEncoder().encode(contract.schemaSource)) !== contract.schemaHash ||
|
|
7698
|
+
if (sha256Hex(new TextEncoder().encode(contract.schemaSource)) !== contract.schemaHash || canonicalJson2(JSON.parse(contract.schemaSource)) !== canonicalJson2(contract.schema))
|
|
7699
7699
|
throw new Error("structured_schema_contract_changed");
|
|
7700
7700
|
if (!/^[a-f0-9]{64}$/.test(contract.schemaHash))
|
|
7701
7701
|
throw new Error("structured_schema_hash_invalid");
|
|
@@ -8139,7 +8139,7 @@ function createModelStarterExecutionAsset(value) {
|
|
|
8139
8139
|
const execution = ModelStarterExecutionSchema.parse(value);
|
|
8140
8140
|
assertExecutionIntegrity(execution);
|
|
8141
8141
|
const id = modelStarterExecutionAssetId({ environmentRelease: { id: execution.environment.id, contentHash: execution.environment.contentHash }, verifierSetRelease: { id: execution.verifierSet.id, contentHash: execution.verifierSet.contentHash } });
|
|
8142
|
-
const generated = createLearningTextAsset({ text:
|
|
8142
|
+
const generated = createLearningTextAsset({ text: canonicalJson(execution), path: "environment/execution.json", mediaType: "application/json", visibility: "host_private" });
|
|
8143
8143
|
const { contentHash: _hash, ...content } = generated;
|
|
8144
8144
|
return sealLearningContent({ ...content, id, asset: { ...content.asset, id } });
|
|
8145
8145
|
}
|
|
@@ -8204,14 +8204,14 @@ function createModelTasksetExecutionResourcesAsset(value) {
|
|
|
8204
8204
|
const resources = ModelTasksetExecutionResourcesSchema.parse({ environment: value.environment, verifierSet: value.verifierSet });
|
|
8205
8205
|
assertIntegrity(resources);
|
|
8206
8206
|
const id = modelTasksetExecutionResourcesAssetId({ environmentRelease: { id: resources.environment.id, contentHash: resources.environment.contentHash }, verifierSetRelease: { id: resources.verifierSet.id, contentHash: resources.verifierSet.contentHash } });
|
|
8207
|
-
const { contentHash: _hash, ...asset } = createLearningTextAsset2({ text:
|
|
8207
|
+
const { contentHash: _hash, ...asset } = createLearningTextAsset2({ text: canonicalJson(resources), path: "environment/resources.json", mediaType: "application/json", visibility: "host_private" });
|
|
8208
8208
|
return sealLearningContent2({ ...asset, id, asset: { ...asset.asset, id } });
|
|
8209
8209
|
}
|
|
8210
8210
|
function resolveModelTasksetExecutionResourcesAsset(context, asset) {
|
|
8211
8211
|
if (asset.id !== modelTasksetExecutionResourcesAssetId(context) || asset.asset.visibility !== "host_private" || asset.asset.mediaType !== "application/json") throw new Error("Taskset execution asset differs from its published references.");
|
|
8212
8212
|
const resources = ModelTasksetExecutionResourcesSchema.parse(JSON.parse(verifyLearningTextAsset2(asset, asset.asset)));
|
|
8213
8213
|
assertIntegrity(resources);
|
|
8214
|
-
if (asset.id !== createModelTasksetExecutionResourcesAsset(resources).id ||
|
|
8214
|
+
if (asset.id !== createModelTasksetExecutionResourcesAsset(resources).id || canonicalJson(context.environment) !== canonicalJson(resources.environment.contract) || canonicalJson(context.graders) !== canonicalJson(resources.verifierSet.graders)) throw new Error("Taskset differs from its execution resources.");
|
|
8215
8215
|
return resources;
|
|
8216
8216
|
}
|
|
8217
8217
|
function assertIntegrity(resources) {
|
|
@@ -8379,7 +8379,7 @@ var TasksetPackageLearningResourcesSchema = z10.object({
|
|
|
8379
8379
|
}).strict();
|
|
8380
8380
|
function learningPackageContextFiles(resources) {
|
|
8381
8381
|
return resources.evidence.filter((evidence) => evidence.submission.evaluatorContext !== null).map((evidence) => {
|
|
8382
|
-
const text =
|
|
8382
|
+
const text = canonicalJson(evidence.submission.evaluatorContext);
|
|
8383
8383
|
const bytes = new TextEncoder().encode(text);
|
|
8384
8384
|
return {
|
|
8385
8385
|
asset: {
|
|
@@ -8942,4 +8942,4 @@ export {
|
|
|
8942
8942
|
createTasksetPackage,
|
|
8943
8943
|
resolveTasksetWorkOutputs
|
|
8944
8944
|
};
|
|
8945
|
-
//# sourceMappingURL=chunk-
|
|
8945
|
+
//# sourceMappingURL=chunk-GV6DEDBU.js.map
|