openpond-sdk 0.12.24 → 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.
Files changed (95) hide show
  1. package/PRODUCT_INTEGRATION.md +134 -0
  2. package/README.md +12 -1
  3. package/TASK_INGESTION.md +88 -86
  4. package/TRAINING_PROTOCOL.md +6 -2
  5. package/dist/advanced-refiner-evaluations.js +3 -3
  6. package/dist/ai-sdk.js +224 -0
  7. package/dist/ai-sdk.js.map +1 -0
  8. package/dist/{chunk-NZRGRUYG.js → chunk-2OVNKPBZ.js} +17 -6
  9. package/dist/chunk-2OVNKPBZ.js.map +1 -0
  10. package/dist/{chunk-QIGMNB6M.js → chunk-3G3HUA32.js} +3 -3
  11. package/dist/{chunk-7G47YXQT.js → chunk-3MWFN7BA.js} +2 -2
  12. package/dist/{chunk-3BYFS4RO.js → chunk-47THZRUM.js} +5 -5
  13. package/dist/chunk-BRP3EBCR.js +245 -0
  14. package/dist/chunk-BRP3EBCR.js.map +1 -0
  15. package/dist/{chunk-BNBPKCIR.js → chunk-DDCR4KB5.js} +4 -4
  16. package/dist/{chunk-ZQ6QTYRE.js → chunk-GV6DEDBU.js} +10 -10
  17. package/dist/{chunk-ZQ6QTYRE.js.map → chunk-GV6DEDBU.js.map} +1 -1
  18. package/dist/{chunk-QCRNQMN4.js → chunk-IXFUYPGV.js} +2 -2
  19. package/dist/{chunk-Q4RGCEOI.js → chunk-JOMZJXGC.js} +3 -3
  20. package/dist/{chunk-OBI2MQYU.js → chunk-QRYEXPG7.js} +7 -7
  21. package/dist/{chunk-6EZAGTZG.js → chunk-RN5MK7NH.js} +4 -4
  22. package/dist/{chunk-GCUWJUUM.js → chunk-RTLJV4OS.js} +2 -2
  23. package/dist/{chunk-GBDBKGXW.js → chunk-T67LNKAK.js} +3 -3
  24. package/dist/{chunk-SP7DQEQM.js → chunk-XBFOFTK3.js} +5 -5
  25. package/dist/{chunk-AG6UJ3DI.js → chunk-YS7DF76T.js} +2 -2
  26. package/dist/{chunk-KEG5QS7W.js → chunk-Z5APNTZE.js} +192 -192
  27. package/dist/chunk-Z5APNTZE.js.map +1 -0
  28. package/dist/connected-evidence.js +8 -8
  29. package/dist/dataset-workspaces.js +146 -85
  30. package/dist/dataset-workspaces.js.map +1 -1
  31. package/dist/experiment-evaluation-schedules.js +11 -11
  32. package/dist/experiments.js +15 -15
  33. package/dist/index.js +71 -44
  34. package/dist/index.js.map +1 -1
  35. package/dist/model-starter-catalog.js +2 -2
  36. package/dist/model-starters.js +2 -2
  37. package/dist/taskset-drafts.js +7 -7
  38. package/dist/taskset-packages.js +13 -13
  39. package/dist/training-bundle.js +12 -12
  40. package/dist/training.js +1839 -1807
  41. package/dist/training.js.map +1 -1
  42. package/dist/types/packages/sdk/src/ai-sdk.d.ts +6 -0
  43. package/dist/types/packages/sdk/src/ai-sdk.d.ts.map +1 -0
  44. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts +21 -21
  45. package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts +8 -1
  46. package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts.map +1 -1
  47. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +140 -140
  48. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  49. package/dist/types/packages/sdk/src/dataset-workspace-error.d.ts +28 -0
  50. package/dist/types/packages/sdk/src/dataset-workspace-error.d.ts.map +1 -0
  51. package/dist/types/packages/sdk/src/dataset-workspaces.d.ts +1 -0
  52. package/dist/types/packages/sdk/src/dataset-workspaces.d.ts.map +1 -1
  53. package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
  54. package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts +28 -28
  55. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts +28 -28
  56. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
  57. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +7 -7
  58. package/dist/types/packages/sdk/src/index.d.ts +13 -4
  59. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  60. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts +347 -347
  61. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +25 -25
  62. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +28 -28
  63. package/dist/types/packages/sdk/src/post-training.d.ts +7 -7
  64. package/dist/types/packages/sdk/src/product-model-response.d.ts +4 -0
  65. package/dist/types/packages/sdk/src/product-model-response.d.ts.map +1 -0
  66. package/dist/types/packages/sdk/src/product-models.d.ts +76 -0
  67. package/dist/types/packages/sdk/src/product-models.d.ts.map +1 -0
  68. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +20 -20
  69. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
  70. package/dist/types/packages/sdk/src/training-evidence.d.ts +54 -0
  71. package/dist/types/packages/sdk/src/training-evidence.d.ts.map +1 -0
  72. package/dist/types/packages/sdk/src/training-harness-sources.d.ts +2 -2
  73. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
  74. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +25 -25
  75. package/dist/types/packages/sdk/src/training.d.ts +2537 -2511
  76. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  77. package/dist/types/packages/sdk/src/types.d.ts +14 -1
  78. package/dist/types/packages/sdk/src/types.d.ts.map +1 -1
  79. package/fixtures/personalized-inference-request.schema.json +316 -0
  80. package/fixtures/python-foundation/schemas.json +3826 -3784
  81. package/package.json +18 -3
  82. package/dist/chunk-KEG5QS7W.js.map +0 -1
  83. package/dist/chunk-NZRGRUYG.js.map +0 -1
  84. /package/dist/{chunk-QIGMNB6M.js.map → chunk-3G3HUA32.js.map} +0 -0
  85. /package/dist/{chunk-7G47YXQT.js.map → chunk-3MWFN7BA.js.map} +0 -0
  86. /package/dist/{chunk-3BYFS4RO.js.map → chunk-47THZRUM.js.map} +0 -0
  87. /package/dist/{chunk-BNBPKCIR.js.map → chunk-DDCR4KB5.js.map} +0 -0
  88. /package/dist/{chunk-QCRNQMN4.js.map → chunk-IXFUYPGV.js.map} +0 -0
  89. /package/dist/{chunk-Q4RGCEOI.js.map → chunk-JOMZJXGC.js.map} +0 -0
  90. /package/dist/{chunk-OBI2MQYU.js.map → chunk-QRYEXPG7.js.map} +0 -0
  91. /package/dist/{chunk-6EZAGTZG.js.map → chunk-RN5MK7NH.js.map} +0 -0
  92. /package/dist/{chunk-GCUWJUUM.js.map → chunk-RTLJV4OS.js.map} +0 -0
  93. /package/dist/{chunk-GBDBKGXW.js.map → chunk-T67LNKAK.js.map} +0 -0
  94. /package/dist/{chunk-SP7DQEQM.js.map → chunk-XBFOFTK3.js.map} +0 -0
  95. /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.outcomeUnknown = status === 0 || status >= 500 || code === "dataset_task_receipt_invalid";
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-NZRGRUYG.js.map
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-GCUWJUUM.js";
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-ZQ6QTYRE.js";
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-QIGMNB6M.js.map
100
+ //# sourceMappingURL=chunk-3G3HUA32.js.map
@@ -3,7 +3,7 @@ import {
3
3
  TasksetPackageSchema,
4
4
  tasksetPackageRewardBinding,
5
5
  validateTasksetPackage
6
- } from "./chunk-ZQ6QTYRE.js";
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-7G47YXQT.js.map
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-AG6UJ3DI.js";
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-3BYFS4RO.js.map
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-Q4RGCEOI.js";
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-GCUWJUUM.js";
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-ZQ6QTYRE.js";
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-BNBPKCIR.js.map
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 as canonicalJson2
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 || canonicalJson(JSON.parse(full.schemaSource)) !== canonicalJson(full.schema))
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 || canonicalJson(sampling.schema) !== canonicalJson(derived) || sha256Hex(expectedSource) !== sampling.schemaHash || sampling.schemaHash !== sampling.declaration.schemaRef.contentHash || new TextEncoder().encode(expectedSource).byteLength !== sampling.declaration.schemaRef.sizeBytes) {
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 || canonicalJson(JSON.parse(contract.schemaSource)) !== canonicalJson(contract.schema))
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: canonicalJson2(execution), path: "environment/execution.json", mediaType: "application/json", visibility: "host_private" });
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: canonicalJson2(resources), path: "environment/resources.json", mediaType: "application/json", visibility: "host_private" });
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 || canonicalJson2(context.environment) !== canonicalJson2(resources.environment.contract) || canonicalJson2(context.graders) !== canonicalJson2(resources.verifierSet.graders)) throw new Error("Taskset differs from its execution resources.");
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 = canonicalJson2(evidence.submission.evaluatorContext);
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-ZQ6QTYRE.js.map
8945
+ //# sourceMappingURL=chunk-GV6DEDBU.js.map