openpond-sdk 0.12.26 → 0.12.27

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 (200) hide show
  1. package/PRODUCT_INTEGRATION.md +13 -6
  2. package/README.md +2 -10
  3. package/SERVERLESS_SERVING.md +52 -35
  4. package/TASK_INGESTION.md +0 -4
  5. package/dist/advanced-refiner-evaluations.js +7 -7
  6. package/dist/ai-sdk.js +20 -83
  7. package/dist/ai-sdk.js.map +1 -1
  8. package/dist/candidate-evaluations.js +6 -6
  9. package/dist/{chunk-UZAVG2WK.js → chunk-3HOGOWKU.js} +8 -6
  10. package/dist/chunk-3HOGOWKU.js.map +1 -0
  11. package/dist/{chunk-YV6PPDXZ.js → chunk-3Z5IK2UK.js} +27 -2
  12. package/dist/chunk-3Z5IK2UK.js.map +1 -0
  13. package/dist/{chunk-4REK5TTE.js → chunk-4D4QSQC3.js} +2 -2
  14. package/dist/{chunk-AMZ2SWHR.js → chunk-534W2O2S.js} +2 -2
  15. package/dist/{chunk-6LVLWRBJ.js → chunk-54BJJL7G.js} +2 -2
  16. package/dist/{chunk-XWUTYFOU.js → chunk-5KJY44FB.js} +3 -3
  17. package/dist/{chunk-QKLZZOZD.js → chunk-7MLFWVDI.js} +29 -10
  18. package/dist/chunk-7MLFWVDI.js.map +1 -0
  19. package/dist/{chunk-4A4FNG4R.js → chunk-7ZV626YS.js} +2 -2
  20. package/dist/{chunk-57ROW3XF.js → chunk-ABOZV47D.js} +2 -2
  21. package/dist/{chunk-3BILL33A.js → chunk-BIQ5TG3T.js} +4 -4
  22. package/dist/{chunk-JINWKUKR.js → chunk-BT6CC6QB.js} +3 -3
  23. package/dist/{chunk-4PEK3YOW.js → chunk-CNFN6GHY.js} +2 -2
  24. package/dist/{chunk-X5AT253K.js → chunk-CVYGJUWM.js} +2 -2
  25. package/dist/{chunk-D26RJQU7.js → chunk-CX7ETU2F.js} +2 -2
  26. package/dist/{chunk-4CDLPMJK.js → chunk-D7LV3USE.js} +2 -2
  27. package/dist/{chunk-WZKKQNYY.js → chunk-GA7OSSEA.js} +2 -2
  28. package/dist/{chunk-EL6KZO43.js → chunk-GFWXDWEE.js} +3 -3
  29. package/dist/{chunk-XYK3MAIC.js → chunk-JYWIKBGD.js} +122 -112
  30. package/dist/chunk-JYWIKBGD.js.map +1 -0
  31. package/dist/{chunk-AQV7RQZH.js → chunk-K4WU4JOP.js} +2 -2
  32. package/dist/{chunk-CAOMKM55.js → chunk-L7MVGGBH.js} +2 -2
  33. package/dist/{chunk-P56JWQYV.js → chunk-LRFVISLA.js} +3 -3
  34. package/dist/{chunk-2U6BQ5C4.js → chunk-MJHQMQEW.js} +3 -3
  35. package/dist/chunk-ON3KSXWR.js +639 -0
  36. package/dist/chunk-ON3KSXWR.js.map +1 -0
  37. package/dist/{chunk-PMVSO23F.js → chunk-RMXZISHK.js} +10 -1
  38. package/dist/chunk-RMXZISHK.js.map +1 -0
  39. package/dist/{chunk-JWEIAEQ6.js → chunk-TMNEDWA7.js} +10 -3
  40. package/dist/chunk-TMNEDWA7.js.map +1 -0
  41. package/dist/{chunk-C7I4ZG6Q.js → chunk-TX552FQG.js} +3 -3
  42. package/dist/{chunk-4CRLQMJ2.js → chunk-VIDRZCPQ.js} +6 -6
  43. package/dist/{chunk-MN4FE52A.js → chunk-VRUAIMM3.js} +7 -7
  44. package/dist/chunk-VRUAIMM3.js.map +1 -0
  45. package/dist/{chunk-H5KHLBC5.js → chunk-WJZHSIGD.js} +6 -8
  46. package/dist/{chunk-H5KHLBC5.js.map → chunk-WJZHSIGD.js.map} +1 -1
  47. package/dist/{chunk-HCUZYGUK.js → chunk-WPTFJZ4L.js} +3 -3
  48. package/dist/connected-evidence.js +7 -7
  49. package/dist/dataset-workspaces.js +10 -10
  50. package/dist/errors.js +1 -1
  51. package/dist/experiment-evaluation-schedules.js +16 -16
  52. package/dist/experiment-improvements.js +7 -7
  53. package/dist/experiments.js +15 -15
  54. package/dist/index.js +23 -23
  55. package/dist/learning.js +15 -4
  56. package/dist/learning.js.map +1 -1
  57. package/dist/model-projects.js +1 -1
  58. package/dist/model-starter-attempts.js +2 -2
  59. package/dist/model-starter-catalog.js +4 -4
  60. package/dist/model-starters.js +4 -4
  61. package/dist/model-taskset-runs.js +3 -3
  62. package/dist/post-training.js +6 -6
  63. package/dist/taskset-drafts.js +6 -6
  64. package/dist/taskset-packages.js +12 -10
  65. package/dist/training-bundle.js +46 -20
  66. package/dist/training-bundle.js.map +1 -1
  67. package/dist/training-hardware.js +2 -2
  68. package/dist/training.js +5620 -4342
  69. package/dist/training.js.map +1 -1
  70. package/dist/types/packages/sdk/src/ai-sdk.d.ts.map +1 -1
  71. package/dist/types/packages/sdk/src/alphaedit-model-serving.d.ts +8 -4
  72. package/dist/types/packages/sdk/src/alphaedit-model-serving.d.ts.map +1 -1
  73. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts +162 -162
  74. package/dist/types/packages/sdk/src/decision-model-serving.d.ts +4 -2
  75. package/dist/types/packages/sdk/src/decision-model-serving.d.ts.map +1 -1
  76. package/dist/types/packages/sdk/src/engram-model-serving.d.ts +3 -1
  77. package/dist/types/packages/sdk/src/engram-model-serving.d.ts.map +1 -1
  78. package/dist/types/packages/sdk/src/experiment-client.d.ts +699 -691
  79. package/dist/types/packages/sdk/src/experiment-client.d.ts.map +1 -1
  80. package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts +34 -28
  81. package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts.map +1 -1
  82. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1889 -1889
  83. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +7 -7
  84. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts +21 -3
  85. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts.map +1 -1
  86. package/dist/types/packages/sdk/src/learning.d.ts +1 -0
  87. package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
  88. package/dist/types/packages/sdk/src/managed-alphaedit-executions.d.ts +272 -16
  89. package/dist/types/packages/sdk/src/managed-alphaedit-executions.d.ts.map +1 -1
  90. package/dist/types/packages/sdk/src/managed-compute-price.d.ts +53 -1
  91. package/dist/types/packages/sdk/src/managed-compute-price.d.ts.map +1 -1
  92. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts +612 -356
  93. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts.map +1 -1
  94. package/dist/types/packages/sdk/src/managed-engram-executions.d.ts +272 -16
  95. package/dist/types/packages/sdk/src/managed-engram-executions.d.ts.map +1 -1
  96. package/dist/types/packages/sdk/src/managed-modification-executions.d.ts +208 -16
  97. package/dist/types/packages/sdk/src/managed-modification-executions.d.ts.map +1 -1
  98. package/dist/types/packages/sdk/src/managed-neuron-training-executions.d.ts +272 -16
  99. package/dist/types/packages/sdk/src/managed-neuron-training-executions.d.ts.map +1 -1
  100. package/dist/types/packages/sdk/src/managed-serving-usage.d.ts +3 -0
  101. package/dist/types/packages/sdk/src/managed-serving-usage.d.ts.map +1 -1
  102. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +25 -25
  103. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  104. package/dist/types/packages/sdk/src/model-learning-capabilities.d.ts +4 -0
  105. package/dist/types/packages/sdk/src/model-learning-capabilities.d.ts.map +1 -0
  106. package/dist/types/packages/sdk/src/model-learning-policy.d.ts.map +1 -1
  107. package/dist/types/packages/sdk/src/model-supervised-training-defaults.d.ts.map +1 -1
  108. package/dist/types/packages/sdk/src/model-training-defaults.d.ts +5 -2
  109. package/dist/types/packages/sdk/src/model-training-defaults.d.ts.map +1 -1
  110. package/dist/types/packages/sdk/src/neuron-training-model-serving.d.ts +8 -4
  111. package/dist/types/packages/sdk/src/neuron-training-model-serving.d.ts.map +1 -1
  112. package/dist/types/packages/sdk/src/post-training.d.ts +7 -7
  113. package/dist/types/packages/sdk/src/product-model-response.d.ts +6 -2
  114. package/dist/types/packages/sdk/src/product-model-response.d.ts.map +1 -1
  115. package/dist/types/packages/sdk/src/product-model-transport.d.ts +99 -0
  116. package/dist/types/packages/sdk/src/product-model-transport.d.ts.map +1 -0
  117. package/dist/types/packages/sdk/src/product-model-wire.d.ts +104 -0
  118. package/dist/types/packages/sdk/src/product-model-wire.d.ts.map +1 -0
  119. package/dist/types/packages/sdk/src/product-models.d.ts +18 -15
  120. package/dist/types/packages/sdk/src/product-models.d.ts.map +1 -1
  121. package/dist/types/packages/sdk/src/serverless-serving.d.ts +416 -9
  122. package/dist/types/packages/sdk/src/serverless-serving.d.ts.map +1 -1
  123. package/dist/types/packages/sdk/src/steering-model-serving.d.ts +2144 -703
  124. package/dist/types/packages/sdk/src/steering-model-serving.d.ts.map +1 -1
  125. package/dist/types/packages/sdk/src/steering-profile-publication.d.ts +631 -0
  126. package/dist/types/packages/sdk/src/steering-profile-publication.d.ts.map +1 -1
  127. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +120 -120
  128. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
  129. package/dist/types/packages/sdk/src/taskset-packages.d.ts +1 -0
  130. package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
  131. package/dist/types/packages/sdk/src/taskset-text-policy.d.ts +11 -0
  132. package/dist/types/packages/sdk/src/taskset-text-policy.d.ts.map +1 -0
  133. package/dist/types/packages/sdk/src/training-compute-selection.d.ts +6 -19
  134. package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
  135. package/dist/types/packages/sdk/src/training-estimates.d.ts +1 -1
  136. package/dist/types/packages/sdk/src/training-experiment-setup.d.ts +4 -1
  137. package/dist/types/packages/sdk/src/training-experiment-setup.d.ts.map +1 -1
  138. package/dist/types/packages/sdk/src/training-harness-sources.d.ts +2 -2
  139. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
  140. package/dist/types/packages/sdk/src/training-model-serving-control.d.ts +406 -8
  141. package/dist/types/packages/sdk/src/training-model-serving-control.d.ts.map +1 -1
  142. package/dist/types/packages/sdk/src/training-model-serving.d.ts +1136 -30
  143. package/dist/types/packages/sdk/src/training-model-serving.d.ts.map +1 -1
  144. package/dist/types/packages/sdk/src/training-operations.d.ts +11197 -0
  145. package/dist/types/packages/sdk/src/training-operations.d.ts.map +1 -0
  146. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +25 -25
  147. package/dist/types/packages/sdk/src/training-supervised.d.ts +13 -0
  148. package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -1
  149. package/dist/types/packages/sdk/src/training-transport.d.ts +4 -1
  150. package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -1
  151. package/dist/types/packages/sdk/src/training.d.ts +15885 -4662
  152. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  153. package/dist/types/packages/sdk/src/weight-inference.d.ts +8 -5
  154. package/dist/types/packages/sdk/src/weight-inference.d.ts.map +1 -1
  155. package/dist/types/packages/sdk/src/weight-model-versions.d.ts +2089 -398
  156. package/dist/types/packages/sdk/src/weight-model-versions.d.ts.map +1 -1
  157. package/dist/types/packages/sdk/src/weight-space-artifact.d.ts +433 -0
  158. package/dist/types/packages/sdk/src/weight-space-artifact.d.ts.map +1 -0
  159. package/dist/types/packages/sdk/src/weight-space-evaluation.d.ts +1437 -0
  160. package/dist/types/packages/sdk/src/weight-space-evaluation.d.ts.map +1 -0
  161. package/dist/types/packages/sdk/src/weight-space-model-serving.d.ts +2910 -0
  162. package/dist/types/packages/sdk/src/weight-space-model-serving.d.ts.map +1 -0
  163. package/dist/types/packages/sdk/src/weight-space-programming.d.ts +845 -0
  164. package/dist/types/packages/sdk/src/weight-space-programming.d.ts.map +1 -0
  165. package/dist/types/packages/sdk/src/weight-space-sessions.d.ts +4600 -0
  166. package/dist/types/packages/sdk/src/weight-space-sessions.d.ts.map +1 -0
  167. package/fixtures/python-foundation/operation-matrix.json +369 -0
  168. package/fixtures/python-foundation/schemas.json +34304 -27905
  169. package/fixtures/python-foundation/training-estimate-http-workflow.json +1 -1
  170. package/package.json +2 -2
  171. package/dist/chunk-JWEIAEQ6.js.map +0 -1
  172. package/dist/chunk-MN4FE52A.js.map +0 -1
  173. package/dist/chunk-PMVSO23F.js.map +0 -1
  174. package/dist/chunk-QKLZZOZD.js.map +0 -1
  175. package/dist/chunk-UZAVG2WK.js.map +0 -1
  176. package/dist/chunk-XYK3MAIC.js.map +0 -1
  177. package/dist/chunk-YV6PPDXZ.js.map +0 -1
  178. package/dist/chunk-ZG4HVCJB.js +0 -248
  179. package/dist/chunk-ZG4HVCJB.js.map +0 -1
  180. /package/dist/{chunk-4REK5TTE.js.map → chunk-4D4QSQC3.js.map} +0 -0
  181. /package/dist/{chunk-AMZ2SWHR.js.map → chunk-534W2O2S.js.map} +0 -0
  182. /package/dist/{chunk-6LVLWRBJ.js.map → chunk-54BJJL7G.js.map} +0 -0
  183. /package/dist/{chunk-XWUTYFOU.js.map → chunk-5KJY44FB.js.map} +0 -0
  184. /package/dist/{chunk-4A4FNG4R.js.map → chunk-7ZV626YS.js.map} +0 -0
  185. /package/dist/{chunk-57ROW3XF.js.map → chunk-ABOZV47D.js.map} +0 -0
  186. /package/dist/{chunk-3BILL33A.js.map → chunk-BIQ5TG3T.js.map} +0 -0
  187. /package/dist/{chunk-JINWKUKR.js.map → chunk-BT6CC6QB.js.map} +0 -0
  188. /package/dist/{chunk-4PEK3YOW.js.map → chunk-CNFN6GHY.js.map} +0 -0
  189. /package/dist/{chunk-X5AT253K.js.map → chunk-CVYGJUWM.js.map} +0 -0
  190. /package/dist/{chunk-D26RJQU7.js.map → chunk-CX7ETU2F.js.map} +0 -0
  191. /package/dist/{chunk-4CDLPMJK.js.map → chunk-D7LV3USE.js.map} +0 -0
  192. /package/dist/{chunk-WZKKQNYY.js.map → chunk-GA7OSSEA.js.map} +0 -0
  193. /package/dist/{chunk-EL6KZO43.js.map → chunk-GFWXDWEE.js.map} +0 -0
  194. /package/dist/{chunk-AQV7RQZH.js.map → chunk-K4WU4JOP.js.map} +0 -0
  195. /package/dist/{chunk-CAOMKM55.js.map → chunk-L7MVGGBH.js.map} +0 -0
  196. /package/dist/{chunk-P56JWQYV.js.map → chunk-LRFVISLA.js.map} +0 -0
  197. /package/dist/{chunk-2U6BQ5C4.js.map → chunk-MJHQMQEW.js.map} +0 -0
  198. /package/dist/{chunk-C7I4ZG6Q.js.map → chunk-TX552FQG.js.map} +0 -0
  199. /package/dist/{chunk-4CRLQMJ2.js.map → chunk-VIDRZCPQ.js.map} +0 -0
  200. /package/dist/{chunk-HCUZYGUK.js.map → chunk-WPTFJZ4L.js.map} +0 -0
@@ -1,12 +1,8 @@
1
1
  # Use OpenPond in your product
2
2
 
3
- The APIs below target the **0.12.25 source candidate**, which is not published
4
- yet. Registry version 0.12.24 does not include configured Dataset/named-model
5
- setup. Use the built candidate package until the coordinated release.
6
-
7
3
 
8
4
  Configure one application-owned server client. Bind aliases to exact callable
9
- Model IDs from your serving destination:
5
+ Model IDs from your OpenPond workspace:
10
6
 
11
7
  ```ts
12
8
  import { createOpenPondClient } from "openpond-sdk";
@@ -48,7 +44,7 @@ for await (const event of openpond.models.support.stream({ prompt: "Explain toke
48
44
  Breaking the iteration cancels the response. An interrupted stream raises
49
45
  `ProductModelError` and never emits a successful `finish`. It may already have
50
46
  incurred usage; inference is never automatically replayed. `serving.timeoutMs`
51
- defaults to 60 seconds and accepts at most 300 seconds. Supply a caller abort
47
+ defaults to 630 seconds and accepts at most 630 seconds, bounded by the signed request deadline and response allowance. Queued requests return HTTP 202; the SDK observes the original retained request by GET and never repeats the paid POST. Unknown outcomes retain `requestId` and `clientRequestId`; use `inspectRequest` or `recover` on the same Model handle. Supply a caller abort
52
48
  signal to cancel an individual request. Text requests are bounded to 1 MiB and
53
49
  results to 8 MiB; individual stream frames to 1 MiB.
54
50
 
@@ -105,6 +101,17 @@ export async function POST(request: Request) {
105
101
  }
106
102
  ```
107
103
 
104
+ The adapter shares the named Model's timeout, request identity and GET-only
105
+ pending observation. After a queued request completes, streaming returns the
106
+ retained text or tool calls followed by usage and finish metadata. It does not
107
+ start another generation or resume native token delivery. On an unknown outcome,
108
+ retain `ProductModelError.clientRequestId` and use the original named Model's
109
+ `recover` method; aborting observation does not cancel retained server work.
110
+ For a binding with `capabilities.tools: true`, `recover` and `inspectRequest` return
111
+ retained calls in `status.result.toolCalls`, with each original `id`, function
112
+ `name` and JSON-text `arguments`. Recovery never executes those calls. The direct
113
+ `generate` and `stream` methods remain text-only and reject tool-call outputs.
114
+
108
115
  Use the AI SDK 7 React `useChat`/transport recipe against your own authenticated
109
116
  backend. Never place the OpenPond client or secrets in browser code. AI SDK's UI
110
117
  stream response is different from raw OpenAI SSE; use
package/README.md CHANGED
@@ -43,19 +43,11 @@ source, package, model and case identities before accepting a run.
43
43
 
44
44
  ## Next.js route handler
45
45
 
46
- Sandbox and model configuration are independently optional. With only `apiKey`,
47
- Work uses OpenPond's hosted defaults. To run tools in your installed runtime while
48
- keeping the hosted model, add `sandbox: { endpoint, apiKey }`. To choose a model,
49
- add `model: { endpoint, apiKey, model }`, where `endpoint` is an OpenAI-compatible
50
- Chat Completions base URL. Each override requires its own credential; credentials
51
- are never borrowed from another service. Both overrides together allow omitting
52
- the hosted `apiKey` for Work.
46
+ With your `apiKey`, Work uses OpenPond’s hosted defaults.
53
47
 
54
48
  The customer runtime uses fresh guests for subsequent turns. Persist history and
55
49
  outputs in your application, then pass them into the next run. A failed output
56
- save retains the guest for recovery; retry persistence before deleting it. Hosted
57
- repository provisioning and spending budgets do not apply to a custom runtime.
58
- An optional UUID `requestId` lets an application reconcile interrupted allocations
50
+ save retains the guest for recovery; retry persistence before deleting it. An optional UUID `requestId` lets an application reconcile interrupted allocations
59
51
  through sandbox metadata; it does not replay model or tool operations.
60
52
 
61
53
  ```ts
@@ -1,37 +1,54 @@
1
- # Usage-based saved Model serving
2
-
3
- A saved trained Model can be activated when the service returns a compatible
4
- Serverless price review. Model availability and GPU residency are separate:
5
- the Model stays callable while unused workers scale down. Cold requests can wait
6
- for model loading; no fixed cold-start latency is promised.
1
+ # Saved Model serving
7
2
 
8
3
  Read `training.modelServing(modelProjectId, { teamId, versionHash })` for the
9
- exact saved version. When `serverlessReview` is available, use
10
- `createServerlessServingApproval(serverlessReview, spendingLimit)` from
11
- `openpond-sdk/training` and include the result as `serverlessApproval` in the
12
- normal `training.controlModelServing` activation request. Retain the original
13
- operation ID and exact request for recovery. The request's idle setting must
14
- match the review's `workerIdleTimeoutSeconds`.
15
-
16
- Activation creates callable configuration. Each inference reserves a finite
17
- amount of workspace credit before dispatch and settles observed allocated
18
- execution time. Compatible requests can share a worker; their quantities divide
19
- the same interval rather than each receiving a full GPU clock. Startup, queue
20
- and idle time have no separate customer charge. Token usage is still reported,
21
- with no additional token charge for the same Serverless request.
22
-
23
- The optional spending limit bounds the accepted activation's cumulative usage.
24
- An omitted limit uses available workspace credit. Pending requests retain their
25
- credit holds until execution release is confirmed. Stop closes new admission
26
- and requests cancellation while preserving outstanding settlement and cleanup.
27
- Delayed supplier records do not increase an accepted customer price.
28
-
29
- Current usage is returned in `control.serverless`: `chargedUsd`, `reservedUsd`,
30
- `quantityMicros` and the retained review. Supplier-cost status is separate from
31
- the customer debit. An unavailable review does not qualify another model or
32
- modification method automatically.
33
-
34
- Python consumers use the same generated request/response contracts and can
35
- import `create_serverless_serving_approval` from `ponder_sdk.serverless_serving`.
36
- The official CLI's `hosted-model-serving` and `hosted-control-model-serving`
37
- operations use these same Model contracts.
4
+ exact saved version. Create an approval from its `serverlessReview` with
5
+ `createServerlessServingApproval` from `openpond-sdk/training`, then include it
6
+ in `training.controlModelServing`. Retain the original operation ID and exact
7
+ request.
8
+
9
+ Read status to follow waiting, starting, running and stopping. Stop requests
10
+ cancellation of the original work; status remains readable while stopping.
11
+
12
+ The signed review's `workerIdleTimeoutSeconds` sets the billable idle reuse
13
+ window. Current v3 reviews support 5 or 60 seconds; new reviews use 60 seconds
14
+ before unused capacity scales to zero. The activation request must use the
15
+ reviewed value. Historical v1/v2 reviews retain their signed 5-second setting.
16
+ For v3, `idleBillable: true` includes this reuse window in accepted usage.
17
+
18
+ ## Pending inference and recovery
19
+
20
+ A queued serving POST returns HTTP 202 with an
21
+ `openpond.modelRequestStatus.v1` receipt. The SDK observes that original request
22
+ with GET requests until its retained result or bounded observer deadline. It
23
+ never resubmits the paid POST. The default observer is 630 seconds;
24
+ `serving.timeoutMs` can shorten it. A queued `stream()` call emits the retained
25
+ completed text and finish event when available.
26
+
27
+ Every SDK call creates a stable `clientRequestId` before POST. You may supply
28
+ one explicitly. If observation ends with an unknown outcome, retain both IDs
29
+ from `ProductModelError` and recover the original operation:
30
+
31
+ ```ts
32
+ try {
33
+ const answer = await model.generate({ prompt: "Explain the result." });
34
+ } catch (error) {
35
+ if (error instanceof ProductModelError && error.outcomeUnknown && error.clientRequestId) {
36
+ const status = await model.recover(error.clientRequestId);
37
+ // status.result is present when the original operation has completed.
38
+ }
39
+ }
40
+ ```
41
+
42
+ `model.inspectRequest(requestId)` reads by canonical request ID;
43
+ `model.cancelRequest(requestId)` explicitly requests cancellation. Recovery
44
+ checks the original actor, current access and exact model identity. Retained
45
+ answers expire after the service's finite retention period. Recovery never
46
+ resubmits the original request.
47
+
48
+ Python uses the same generated serving contracts and
49
+ `create_serverless_serving_approval` from `ponder_sdk.serverless_serving`.
50
+ Named model calls accept `client_request_id` and a serving-only `timeout`
51
+ (default and maximum 630 seconds). Use `recover`, `inspect_request` and
52
+ `cancel_request` on the same handle, awaiting them on `AsyncClient`.
53
+ `ModelRequestError.client_request_id` retains the original operation identity.
54
+ The official hosted Model-serving CLI operations use these same contracts.
package/TASK_INGESTION.md CHANGED
@@ -1,9 +1,5 @@
1
1
  # Add tasks to a Dataset
2
2
 
3
- The APIs below target the **0.12.25 source candidate**, which is not published
4
- yet. Registry version 0.12.24 does not include configured Dataset/named-model
5
- setup. Use the built candidate package until the coordinated release.
6
-
7
3
 
8
4
  Configure a client once in your product's server module. Submit one structured
9
5
  source event with `await addTask(task)`:
@@ -12,16 +12,16 @@ import {
12
12
  sealAdvancedRefinerEvaluationPin,
13
13
  sealAdvancedRefinerReviewReceipt,
14
14
  verifyAdvancedRefinerEvaluationPin
15
- } from "./chunk-X5AT253K.js";
16
- import "./chunk-D26RJQU7.js";
15
+ } from "./chunk-CVYGJUWM.js";
16
+ import "./chunk-CX7ETU2F.js";
17
17
  import "./chunk-456F3BXD.js";
18
- import "./chunk-JWEIAEQ6.js";
18
+ import "./chunk-TMNEDWA7.js";
19
19
  import "./chunk-O6FKHAWN.js";
20
20
  import "./chunk-H3367ISL.js";
21
- import "./chunk-4REK5TTE.js";
22
- import "./chunk-XWUTYFOU.js";
23
- import "./chunk-CAOMKM55.js";
24
- import "./chunk-H5KHLBC5.js";
21
+ import "./chunk-4D4QSQC3.js";
22
+ import "./chunk-5KJY44FB.js";
23
+ import "./chunk-L7MVGGBH.js";
24
+ import "./chunk-WJZHSIGD.js";
25
25
  import "./chunk-CL3IOOVL.js";
26
26
  import "./chunk-B3ZHJ2KK.js";
27
27
  import "./chunk-H3JZ3P5T.js";
package/dist/ai-sdk.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  ProductModelError,
3
+ ProductModelTransport,
3
4
  productModelEndpoint
4
- } from "./chunk-ZG4HVCJB.js";
5
+ } from "./chunk-ON3KSXWR.js";
5
6
  import "./chunk-B3ZHJ2KK.js";
6
7
  import "./chunk-QYWPNNP3.js";
7
8
  import "./chunk-YLJ4XMA6.js";
@@ -11,72 +12,6 @@ import {
11
12
  createOpenAICompatible
12
13
  } from "@ai-sdk/openai-compatible";
13
14
  import { z } from "zod";
14
-
15
- // src/product-model-response.ts
16
- function boundProductModelResponse(response) {
17
- if (!response.body) return response;
18
- const streaming = response.headers.get("content-type")?.includes("text/event-stream") ?? false;
19
- const reader = response.body.getReader();
20
- const decoder = new TextDecoder();
21
- let total = 0, pending = "", terminal = false;
22
- let identity;
23
- const fail = () => new ProductModelError(
24
- streaming ? "model_stream_interrupted" : "model_response_invalid",
25
- response.status,
26
- true,
27
- response.headers.get("x-openpond-request-id") ?? response.headers.get("x-request-id") ?? void 0
28
- );
29
- const body = new ReadableStream({
30
- async pull(controller) {
31
- try {
32
- const { done, value } = await reader.read();
33
- if (done) {
34
- if (streaming && !terminal) throw fail();
35
- controller.close();
36
- reader.releaseLock();
37
- return;
38
- }
39
- total += value.byteLength;
40
- if (total > 8 * 1024 * 1024) throw fail();
41
- if (streaming) {
42
- pending = (pending + decoder.decode(value, { stream: true })).replace(/\r\n/g, "\n");
43
- let boundary;
44
- while ((boundary = pending.indexOf("\n\n")) >= 0) {
45
- const frame = pending.slice(0, boundary);
46
- pending = pending.slice(boundary + 2);
47
- if (new TextEncoder().encode(frame).length > 1024 * 1024) throw fail();
48
- const data = frame.split("\n").filter((line) => line.startsWith("data:")).map((line) => line.slice(5).trimStart()).join("\n");
49
- if (data === "[DONE]") terminal = true;
50
- else if (data) {
51
- const chunk = JSON.parse(data);
52
- if (typeof chunk.id === "string" && typeof chunk.model === "string") {
53
- if (identity && (chunk.id !== identity.id || chunk.model !== identity.model))
54
- throw fail();
55
- identity = { id: chunk.id, model: chunk.model };
56
- }
57
- }
58
- }
59
- if (new TextEncoder().encode(pending).length > 1024 * 1024) throw fail();
60
- }
61
- controller.enqueue(value);
62
- } catch {
63
- await reader.cancel().catch(() => {
64
- });
65
- controller.error(fail());
66
- }
67
- },
68
- async cancel(reason) {
69
- await reader.cancel(reason);
70
- }
71
- });
72
- return new Response(body, {
73
- status: response.status,
74
- statusText: response.statusText,
75
- headers: response.headers
76
- });
77
- }
78
-
79
- // src/ai-sdk.ts
80
15
  var Evidence = z.object({ openpond: z.record(z.string(), z.json()) }).passthrough();
81
16
  function metadata(raw) {
82
17
  const value = Evidence.safeParse(raw);
@@ -84,6 +19,7 @@ function metadata(raw) {
84
19
  }
85
20
  function toAIModel(model) {
86
21
  const connection = model.providerConnection();
22
+ const transport = new ProductModelTransport(model.id, connection);
87
23
  const provider = createOpenAICompatible({
88
24
  name: "openpond",
89
25
  baseURL: productModelEndpoint(connection.baseUrl),
@@ -130,18 +66,14 @@ function toAIModel(model) {
130
66
  },
131
67
  supportsStructuredOutputs: model.capabilities.structuredOutput,
132
68
  fetch: async (url, init) => {
133
- const timeout = AbortSignal.timeout(connection.timeoutMs ?? 6e4);
134
- const headers = new Headers(init?.headers);
135
- headers.set("Authorization", `Bearer ${connection.apiKey}`);
136
- if (connection.teamId) headers.set("X-OpenPond-Team-Id", connection.teamId);
137
- return boundProductModelResponse(
138
- await (connection.fetch ?? fetch)(url, {
139
- ...init,
140
- redirect: "error",
141
- headers,
142
- signal: init?.signal ? AbortSignal.any([init.signal, timeout]) : timeout
143
- })
144
- );
69
+ if (String(url) !== `${productModelEndpoint(connection.baseUrl)}/chat/completions` || init?.method?.toUpperCase() !== "POST" || typeof init.body !== "string")
70
+ throw new ProductModelError("transport_override_forbidden", 0, false);
71
+ const body = JSON.parse(init.body);
72
+ return transport.request(init.body, {
73
+ stream: body.stream === true,
74
+ headers: init.headers,
75
+ signal: init.signal
76
+ });
145
77
  }
146
78
  }).chatModel(model.id);
147
79
  const check = (options) => {
@@ -159,16 +91,21 @@ function toAIModel(model) {
159
91
  ))
160
92
  throw new ProductModelError("input_capability_unsupported", 0, false);
161
93
  };
162
- const normalizeError = (error) => {
94
+ const normalizeError = (error, streamHeaders) => {
163
95
  if (error instanceof ProductModelError) return error;
164
96
  if (error && typeof error === "object" && "cause" in error && error.cause instanceof ProductModelError)
165
97
  return error.cause;
166
98
  const status = error && typeof error === "object" && "statusCode" in error && typeof error.statusCode === "number" ? error.statusCode : 0;
167
99
  const unknown = status === 0 || status === 408 || status >= 500 || status >= 200 && status < 300;
100
+ const responseHeaders = error && typeof error === "object" && "responseHeaders" in error && error.responseHeaders && typeof error.responseHeaders === "object" ? error.responseHeaders : streamHeaders ?? {};
101
+ const requestId = responseHeaders["x-openpond-request-id"] ?? responseHeaders["x-request-id"];
102
+ const clientRequestId = responseHeaders["x-openpond-client-request-id"];
168
103
  return new ProductModelError(
169
104
  status >= 400 ? "model_request_rejected" : "model_outcome_unknown",
170
105
  status,
171
- unknown
106
+ unknown,
107
+ typeof requestId === "string" ? requestId : void 0,
108
+ typeof clientRequestId === "string" ? clientRequestId : void 0
172
109
  );
173
110
  };
174
111
  return {
@@ -202,10 +139,10 @@ function toAIModel(model) {
202
139
  reader.releaseLock();
203
140
  } else
204
141
  controller.enqueue(
205
- value.type === "error" ? { ...value, error: normalizeError(value.error) } : value
142
+ value.type === "error" ? { ...value, error: normalizeError(value.error, result.response?.headers) } : value
206
143
  );
207
144
  } catch (error) {
208
- controller.error(normalizeError(error));
145
+ controller.error(normalizeError(error, result.response?.headers));
209
146
  }
210
147
  },
211
148
  async cancel(reason) {
@@ -1 +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":"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","names":[]}
1
+ {"version":3,"sources":["../src/ai-sdk.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 { ProductModelTransport } from \"./product-model-transport.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 transport = new ProductModelTransport(model.id, connection);\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 // The provider only serializes/parses OpenAI-compatible payloads. All\n // submission, identity and pending observation belong to the shared wire\n // transport, including when this call asks for a stream.\n if (String(url) !== `${productModelEndpoint(connection.baseUrl!)}/chat/completions`\n || init?.method?.toUpperCase() !== \"POST\" || typeof init.body !== \"string\")\n throw new ProductModelError(\"transport_override_forbidden\", 0, false);\n const body = JSON.parse(init.body) as { stream?: boolean };\n return transport.request(init.body, { stream: body.stream === true,\n headers: init.headers, signal: init.signal });\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, streamHeaders?: Record<string, string | undefined>): 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 const responseHeaders = error && typeof error === \"object\" && \"responseHeaders\" in error\n && error.responseHeaders && typeof error.responseHeaders === \"object\"\n ? error.responseHeaders as Record<string, unknown> : streamHeaders ?? {};\n const requestId = responseHeaders[\"x-openpond-request-id\"] ?? responseHeaders[\"x-request-id\"];\n const clientRequestId = responseHeaders[\"x-openpond-client-request-id\"];\n return new ProductModelError(\n status >= 400 ? \"model_request_rejected\" : \"model_outcome_unknown\",\n status,\n unknown,\n typeof requestId === \"string\" ? requestId : undefined,\n typeof clientRequestId === \"string\" ? clientRequestId : undefined,\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, result.response?.headers) }\n : value,\n );\n } catch (error) {\n controller.error(normalizeError(error, result.response?.headers));\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"],"mappings":"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","names":[]}
@@ -5,12 +5,12 @@ import {
5
5
  CandidateEvaluationPreparationSchema,
6
6
  CandidateEvaluationRequestSchema,
7
7
  createCandidateEvaluationClient
8
- } from "./chunk-AMZ2SWHR.js";
9
- import "./chunk-2U6BQ5C4.js";
10
- import "./chunk-4REK5TTE.js";
11
- import "./chunk-XWUTYFOU.js";
12
- import "./chunk-CAOMKM55.js";
13
- import "./chunk-H5KHLBC5.js";
8
+ } from "./chunk-534W2O2S.js";
9
+ import "./chunk-MJHQMQEW.js";
10
+ import "./chunk-4D4QSQC3.js";
11
+ import "./chunk-5KJY44FB.js";
12
+ import "./chunk-L7MVGGBH.js";
13
+ import "./chunk-WJZHSIGD.js";
14
14
  import "./chunk-CL3IOOVL.js";
15
15
  import "./chunk-B3ZHJ2KK.js";
16
16
  import "./chunk-H3JZ3P5T.js";
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  ManagedSftRecipeSchema
3
- } from "./chunk-YV6PPDXZ.js";
3
+ } from "./chunk-3Z5IK2UK.js";
4
4
  import {
5
5
  ModelStarterExecutionSchema,
6
6
  validateModelStarterExecution,
7
7
  validateModelTasksetPackage,
8
8
  validateTasksetPackage
9
- } from "./chunk-AQV7RQZH.js";
9
+ } from "./chunk-K4WU4JOP.js";
10
10
  import {
11
11
  ModelProjectBaseModelSchema,
12
12
  ModelProjectRecipeDocumentSchema,
13
13
  ModelProjectTrainingMethodSchema,
14
14
  ModelProjectTrainingSetupSchema,
15
15
  ModelProjectVersionedRefSchema
16
- } from "./chunk-H5KHLBC5.js";
16
+ } from "./chunk-WJZHSIGD.js";
17
17
  import {
18
18
  ModelInitialLearningSchema
19
19
  } from "./chunk-CL3IOOVL.js";
@@ -73,6 +73,7 @@ function createSupervisedTrainingRecipeDefaults(saved, baseModel) {
73
73
  schemaVersion: "openpond.sftRecipe.v1",
74
74
  method: "sft",
75
75
  parameterization: "lora",
76
+ ...source?.evaluation ? { evaluation: source.evaluation } : {},
76
77
  ...source?.baseModel ? { baseModel: source.baseModel } : {},
77
78
  dataset: {
78
79
  completionOnly: true,
@@ -147,9 +148,10 @@ function createModelTrainingRecipeDefaults(saved, method = saved?.method === "sf
147
148
  resourceLimits: { ...defaults.resourceLimits, ...fields2(grpo?.resourceLimits) }
148
149
  };
149
150
  }
150
- function rebindModelTrainingRecipe(saved) {
151
+ function rebindModelTrainingRecipe(saved, options = {}) {
151
152
  const { baseModel: _base, reward: _reward, policyOptimization: _compiled, ...recipe } = createModelTrainingRecipeDefaults(saved);
152
- const { trainSplit: _train, validationSplit: _validation, maxExamples: _population, ...dataset } = fields2(recipe.dataset);
153
+ const { trainSplit: _train, validationSplit: _validation, validationTaskIds, maxExamples: _population, ...remaining } = fields2(recipe.dataset);
154
+ const dataset = { ...remaining, ...options.preserveValidationSelection && validationTaskIds !== void 0 ? { validationTaskIds } : {} };
153
155
  return recipe.method === "sft" ? { ...recipe, dataset: { ...dataset, ..._validation ? { validationSplit: _validation } : {} } } : { ...recipe, dataset, policyOptimization: null };
154
156
  }
155
157
  function prepareModelTrainingDefaults(input) {
@@ -443,4 +445,4 @@ export {
443
445
  previewModelStarter,
444
446
  validateResolvedModelStarter
445
447
  };
446
- //# sourceMappingURL=chunk-UZAVG2WK.js.map
448
+ //# sourceMappingURL=chunk-3HOGOWKU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/model-starters.ts","../src/model-training-defaults.ts","../src/model-supervised-training-defaults.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ModelInitialLearningSchema } from \"./model-learning-intent.js\";\nimport { TasksetReleaseSchema, assertTasksetRelease } from \"@openpond/evals/tasksets\";\nimport { LearningTextAssetSchema, TaskDefinitionSchema, learningRef, sameLearningRef, sealLearningContent } from \"@openpond/evals/learning\";\nimport { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from \"@openpond/evals/rewards\";\nimport { assertBoundedTaskJson, validateTaskValue } from \"@openpond/evals/task-schema\";\n\nimport { ModelProjectBaseModelSchema, ModelProjectRecipeDocumentSchema, ModelProjectTrainingMethodSchema, ModelProjectVersionedRefSchema, ModelProjectTrainingSetupSchema } from \"./model-projects.js\";\nimport { canonicalSha256 } from \"./protocol.js\";\nimport { ModelStarterExecutionSchema, validateModelStarterExecution } from \"./model-starter-execution.js\";\n\nexport { ModelStarterExecutionSchema, ModelStarterEnvironmentAttemptSchema, verifyModelStarterEnvironmentAttempt, ModelStarterToolFixtureScriptSchema, createModelStarterExecutionAsset, modelStarterExecutionAssetId, resolveModelStarterExecutionAsset, type ModelStarterExecution, type ModelStarterExecutionContext } from \"./model-starter-execution.js\";\nexport { NativeHarnessExperimentAttemptSchema, verifyNativeHarnessExperimentAttempt, type NativeHarnessExperimentAttempt } from \"./model-starter-execution.js\";\nexport { ModelTasksetDerivationSchema, ModelTasksetPackageSchema, deriveModelTaskset, validateModelTasksetPackage, type ModelTasksetPackage } from \"./model-taskset-derivation.js\";\nexport { ModelTasksetExecutionResourcesSchema, createModelTasksetExecutionResourcesAsset, modelTasksetExecutionResourcesAssetId, resolveModelTasksetExecutionResourcesAsset } from \"./model-taskset-resources.js\";\nexport { prepareModelTrainingDefaults, createModelTrainingRecipeDefaults, rebindModelTrainingRecipe } from \"./model-training-defaults.js\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst RefSchema = ModelProjectVersionedRefSchema;\n\n/** Catalog records contain references and previews, never the private task rows. */\nexport const ModelStarterContentSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarter.v1\"),\n id: IdSchema,\n revision: z.number().int().positive(),\n name: z.string().trim().min(1).max(200),\n description: z.string().trim().min(1).max(2_000),\n category: z.enum([\"extraction\", \"support\", \"operations\", \"knowledge\", \"coding\", \"writing\", \"classification\"]),\n taskset: RefSchema,\n taskDefinition: RefSchema,\n rewardBinding: RefSchema,\n rewards: z.array(RefSchema).min(1).max(100),\n assets: z.array(RefSchema).max(1_000),\n previewTaskIds: z.array(IdSchema).min(1).max(8),\n startingModel: ModelProjectBaseModelSchema,\n supportedMethods: z.array(ModelProjectTrainingMethodSchema).min(1).max(8),\n defaultMethod: ModelProjectTrainingMethodSchema,\n provenance: z.object({ author: z.string().min(1).max(200), license: z.string().min(1).max(200), sourceDescription: z.string().min(1).max(2_000) }).strict(),\n // These are references to real results. Package publication does not create\n // evidence, qualify a starter, or enable continuous learning.\n evidence: z.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict(),\n}).strict().superRefine((starter, context) => {\n if (!starter.supportedMethods.includes(starter.defaultMethod)) context.addIssue({ code: \"custom\", path: [\"defaultMethod\"], message: \"The default method must be supported by the package.\" });\n for (const field of [\"rewards\", \"assets\"] as const) {\n if (new Set(starter[field].map(ref => ref.id)).size !== starter[field].length) context.addIssue({ code: \"custom\", path: [field], message: \"Dependency identities must be unique.\" });\n }\n if (new Set(starter.previewTaskIds).size !== starter.previewTaskIds.length) context.addIssue({ code: \"custom\", path: [\"previewTaskIds\"], message: \"Preview tasks must be unique.\" });\n});\nexport const ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z.string().regex(/^[a-f0-9]{64}$/) });\nexport type ModelStarter = z.infer<typeof ModelStarterSchema>;\n\n/** A resolved small package, obtained separately from catalog discovery.\n * Large Tasksets remain manifest/shard resources; they are not list payloads. */\nexport const ResolvedModelStarterSchema = z.object({\n starter: ModelStarterSchema,\n taskset: TasksetReleaseSchema,\n taskDefinition: TaskDefinitionSchema,\n rewardBinding: RewardBindingSchema,\n rewards: z.array(RewardReleaseSchema).min(1).max(100),\n assets: z.array(LearningTextAssetSchema).max(1_000),\n execution: ModelStarterExecutionSchema.optional(),\n}).strict();\nexport type ResolvedModelStarter = z.infer<typeof ResolvedModelStarterSchema>;\n\n/** Publisher attestation for original synthetic contact data, never a caller\n * override for arbitrary imports or for a failed secret scan. */\nexport const ModelStarterPrivacyReviewSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarterPrivacyReview.v1\"),\n disposition: z.literal(\"synthetic_only\"),\n reviewedBy: z.string().trim().min(1).max(500), reviewedAt: z.iso.datetime(),\n reviewedContentHash: z.string().regex(/^[a-f0-9]{64}$/),\n note: z.string().trim().min(1).max(2_000),\n}).strict();\nexport function modelStarterPrivacyContentHash(value: ResolvedModelStarter): string {\n const { contentHash: _starterHash, ...starter } = value.starter;\n const { contentHash: _tasksetHash, ...taskset } = value.taskset;\n const { contentHash: _referenceHash, ...tasksetRef } = starter.taskset;\n const metadata = { ...taskset.metadata };\n const authoring = metadata.starterAuthoring;\n if (authoring && typeof authoring === \"object\" && !Array.isArray(authoring)) {\n const { privacyReview: _review, ...content } = authoring as Record<string, unknown>;\n metadata.starterAuthoring = content;\n }\n // Exclude only the attestation and hashes that contain that attestation.\n return sealLearningContent({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;\n}\n\n/** Final creation intent. The server resolves package bytes from its catalog;\n * callers cannot supply executable resources or qualification receipts here. */\nexport const ModelStarterCreationIntentSchema = z.object({\n profileId: IdSchema,\n modelId: IdSchema,\n name: z.string().trim().min(1).max(200),\n starter: RefSchema,\n startingModel: ModelProjectBaseModelSchema,\n method: ModelProjectTrainingMethodSchema,\n rewardBindingRef: RefSchema.nullable().optional(),\n recipe: ModelProjectRecipeDocumentSchema.nullable().optional(),\n managedGpuSelection: ModelProjectTrainingSetupSchema.shape.managedGpuSelection,\n continuationAdapterMode: ModelProjectTrainingSetupSchema.shape.continuationAdapterMode,\n learning: ModelInitialLearningSchema.optional(),\n}).strict();\nexport const ModelStarterCreationRequestSchema = ModelStarterCreationIntentSchema.extend({\n schemaVersion: z.literal(\"openpond.modelStarterCreation.v1\"),\n operationId: IdSchema,\n}).strict();\nexport type ModelStarterCreationRequest = z.infer<typeof ModelStarterCreationRequestSchema>;\n\nexport function parseModelStarterCreationRequest(value: unknown): ModelStarterCreationRequest {\n assertBoundedTaskJson(value, 64 * 1024);\n return ModelStarterCreationRequestSchema.parse(value);\n}\n\n/** Prepare once on final confirmation and retain across uncertain transport\n * outcomes. The server must bind operationId to the complete original intent\n * and atomically commit resources, model configuration and the retry receipt. */\nexport async function createModelStarterCreationRequest(\n value: z.input<typeof ModelStarterCreationIntentSchema>,\n): Promise<ModelStarterCreationRequest> {\n assertBoundedTaskJson(value, 64 * 1024);\n const intent = ModelStarterCreationIntentSchema.parse(value);\n return parseModelStarterCreationRequest({\n ...intent,\n schemaVersion: \"openpond.modelStarterCreation.v1\",\n operationId: `model-starter:${await canonicalSha256(intent)}`,\n });\n}\n\n/** Scope authorization belongs to the API. This validates the final intent\n * against the exact trusted package before any user resources are written. */\nexport function validateModelStarterCreation(value: unknown, packageValue: unknown) {\n const request = parseModelStarterCreationRequest(value);\n const resolved = validateResolvedModelStarter(packageValue);\n if (!sameLearningRef(request.starter, learningRef(resolved.starter))) throw new Error(\"Starter creation references a different package revision.\");\n if (!resolved.starter.supportedMethods.includes(request.method)) throw new Error(\"The selected training method is not supported by this starter.\");\n return { request, resolved };\n}\n\n/** Explicit projection keeps frozen examples, expected outputs, privileged\n * context and verifier source out of read-only model-facing previews. */\nexport function previewModelStarter(value: unknown) {\n const { starter, taskset, taskDefinition, rewardBinding, rewards } = validateResolvedModelStarter(value);\n return {\n starter,\n inputSchema: taskDefinition.inputSchema,\n outputSchema: taskDefinition.outputSchema,\n reward: {\n name: rewardBinding.name,\n description: rewardBinding.description,\n checks: rewardBinding.sources.map(source => {\n const reward = rewards.find(reward => sameLearningRef(source.reward, learningRef(reward)))!;\n return { name: reward.name, description: reward.description, kind: reward.implementation.kind, role: source.role, weight: source.weight, required: source.required, hardGate: source.hardGate };\n }),\n },\n tasks: starter.previewTaskIds.map(id => {\n const task = taskset.tasks.find(task => task.id === id)!;\n return { id: task.id, input: task.input, policyVisibleContext: task.policyVisibleContext };\n }),\n counts: {\n train: taskset.tasks.filter(task => task.split === \"train\").length,\n validation: taskset.tasks.filter(task => task.split === \"validation\").length,\n frozenEvaluation: taskset.tasks.filter(task => task.split === \"frozen_eval\").length,\n },\n };\n}\n\n/** Verify the dependency graph before creating user-owned configuration.\n * A matching outer hash alone cannot authorize substituted private graders. */\nexport function validateResolvedModelStarter(value: unknown): ResolvedModelStarter {\n assertBoundedTaskJson(value, 16 * 1024 * 1024);\n const resolved = ResolvedModelStarterSchema.parse(value);\n const { starter, taskset, taskDefinition, rewardBinding, rewards, assets } = resolved;\n const authoring = taskset.metadata.starterAuthoring;\n if (authoring && typeof authoring === \"object\" && !Array.isArray(authoring) && \"privacyReview\" in authoring) {\n const review = ModelStarterPrivacyReviewSchema.parse(authoring.privacyReview);\n if (review.reviewedContentHash !== modelStarterPrivacyContentHash(resolved)) throw new Error(\"Starter privacy review differs from the published contents.\");\n }\n const resources = [starter, taskset, taskDefinition, rewardBinding, ...rewards, ...assets];\n for (const resource of resources) {\n const { contentHash, ...content } = resource;\n if (sealLearningContent(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);\n }\n assertTasksetRelease(taskset);\n validateModelStarterExecution(resolved.execution, taskset, assets);\n function exact(expected: z.infer<typeof RefSchema>, resource: { id: string; revision: number; contentHash: string }) {\n if (!sameLearningRef(expected, learningRef(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);\n }\n exact(starter.taskset, taskset);\n exact(starter.taskDefinition, taskDefinition);\n exact(starter.rewardBinding, rewardBinding);\n exact(taskDefinition.rewardBinding, rewardBinding);\n if (rewardBinding.recipeRef) throw new Error(\"Starter binding recipes must be resolved into a standalone binding before publication.\");\n const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;\n const execution = { policy, environment, ...(environmentRelease ? { environmentRelease } : {}), tools, capabilities, ...(verifierSetRelease ? { verifierSetRelease } : {}) };\n if (sealLearningContent(execution).contentHash !== sealLearningContent(taskDefinition.execution).contentHash) throw new Error(\"Starter execution context differs from its task format.\");\n if (sealLearningContent({ graders: taskset.graders }).contentHash !== sealLearningContent({ graders: compileBoundGraders(rewardBinding, rewards) }).contentHash) throw new Error(\"Starter executable graders differ from its Reward binding.\");\n for (const [references, values] of [[starter.rewards, rewards], [starter.assets, assets]] as const) {\n if (references.length !== values.length || new Set(values.map(resource => resource.id)).size !== values.length) throw new Error(\"Starter dependency inventory mismatch.\");\n for (const ref of references) {\n const resource = values.find(value => value.id === ref.id);\n if (!resource) throw new Error(`Starter dependency is missing: ${ref.id}.`);\n exact(ref, resource);\n }\n }\n for (const source of rewardBinding.sources) {\n const reward = rewards.find(reward => reward.id === source.reward.id);\n if (!reward) throw new Error(`Starter Reward is missing: ${source.reward.id}.`);\n exact(source.reward, reward);\n }\n for (const reward of rewards) {\n const implementation = reward.implementation;\n const references = [...reward.assets,\n ...(\"verifierRef\" in implementation ? [implementation.verifierRef] : []),\n ...(\"rubricRef\" in implementation ? [implementation.rubricRef] : []),\n ...(\"inputContract\" in implementation ? [implementation.inputContract] : []),\n ];\n for (const ref of references) {\n const asset = assets.find(asset => asset.id === ref.id);\n if (!asset || sealLearningContent(asset.asset).contentHash !== sealLearningContent(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);\n if (ref.visibility === \"policy\") throw new Error(`Starter Reward source must remain private to its evaluator: ${ref.id}.`);\n }\n }\n if (new Set(taskset.tasks.map(task => task.id)).size !== taskset.tasks.length) throw new Error(\"Starter task identities must be unique.\");\n const inputSplits = new Map<string, string>();\n for (const task of taskset.tasks) {\n if (task.policyVisibleContext.instructions !== taskDefinition.instructions) throw new Error(`Starter task does not carry its declared model instructions: ${task.id}.`);\n const inputHash = sealLearningContent({ input: task.input, context: task.policyVisibleContext }).contentHash;\n const priorSplit = inputSplits.get(inputHash);\n if (priorSplit && priorSplit !== task.split) throw new Error(\"Starter policy input appears in multiple splits.\");\n inputSplits.set(inputHash, task.split);\n if (!validateTaskValue(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);\n if (task.expectedOutput !== null && !validateTaskValue(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);\n }\n for (const id of starter.previewTaskIds) {\n const task = taskset.tasks.find(task => task.id === id);\n if (!task || task.split === \"frozen_eval\") throw new Error(`Starter preview task is unavailable: ${id}.`);\n }\n return resolved;\n}\n","import { contentHash } from \"@openpond/harness\";\nimport { compileBoundGraders } from \"@openpond/evals/rewards\";\nimport { validateModelTasksetPackage } from \"./model-taskset-derivation.js\";\nimport { ModelProjectTrainingSetupSchema, type ModelProjectTrainingSetup } from \"./model-projects.js\";\nimport { createSupervisedTrainingRecipeDefaults } from \"./model-supervised-training-defaults.js\";\nimport { ManagedSftRecipeSchema } from \"./training-supervised.js\";\n\nfunction fields(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\n/** Editable method-specific defaults exist before tasks/base/grader are bound.\n * This draft never authorizes execution; package preparation binds those inputs. */\nexport function createModelTrainingRecipeDefaults(\n saved?: ModelProjectTrainingSetup[\"recipe\"],\n method: \"grpo\" | \"sft\" = saved?.method === \"sft\" ? \"sft\" : \"grpo\",\n baseModel?: ModelProjectTrainingSetup[\"baseModel\"],\n): NonNullable<ModelProjectTrainingSetup[\"recipe\"]> {\n if (method === \"sft\") return createSupervisedTrainingRecipeDefaults(saved, baseModel);\n const grpo = saved?.method === \"grpo\" ? saved : undefined;\n const defaults = {\n schemaVersion: \"openpond.rftRecipe.v1\", method: \"grpo\" as const, parameterization: \"lora\" as const,\n lora: { rank: 2 },\n rollout: { groupSize: 8, concurrency: 4, maxOutputTokens: 1_024, temperature: 0.8, topP: 1, seed: 17 },\n optimizer: { learningRate: 0.0001, maxSteps: 8, clipRange: 0.2, iterations: 2,\n microbatchSize: 1, gradientAccumulationSteps: 8, advantageEpsilon: 1e-8,\n adamw: { name: \"adamw\", weightDecay: 0, beta1: 0.9, beta2: 0.999, epsilon: 1e-8 } },\n loss: { method: \"grpo\", klBeta: 0.01 },\n resourceLimits: { wallTimeMs: 66 * 60 * 1_000, maxRollouts: 64, maxPayloadBytes: 1_000_000 },\n policyOptimization: null,\n };\n return {\n ...defaults, ...grpo,\n lora: { ...defaults.lora, ...fields(grpo?.lora) },\n rollout: { ...defaults.rollout, ...fields(grpo?.rollout) },\n optimizer: { ...defaults.optimizer, ...fields(grpo?.optimizer),\n adamw: { ...defaults.optimizer.adamw, ...fields(fields(grpo?.optimizer).adamw) } },\n loss: { ...defaults.loss, ...fields(grpo?.loss) },\n resourceLimits: { ...defaults.resourceLimits, ...fields(grpo?.resourceLimits) },\n };\n}\n\n/** Changing source inputs invalidates only their bindings, preserving the\n * caller's optimizer, rollout, adapter, loss and budget settings. */\nexport function rebindModelTrainingRecipe(saved: ModelProjectTrainingSetup[\"recipe\"], options: { preserveValidationSelection?: boolean } = {}) {\n const { baseModel: _base, reward: _reward, policyOptimization: _compiled, ...recipe } = createModelTrainingRecipeDefaults(saved);\n // Split names and the derived source population belong to the new package.\n // Retain authoring controls such as prompt length/selection strategy.\n const { trainSplit: _train, validationSplit: _validation, validationTaskIds, maxExamples: _population, ...remaining } = fields(recipe.dataset);\n const dataset = { ...remaining, ...(options.preserveValidationSelection && validationTaskIds !== undefined ? { validationTaskIds } : {}) };\n return recipe.method === \"sft\"\n ? { ...recipe, dataset: { ...dataset, ...(_validation ? { validationSplit: _validation } : {}) } }\n : { ...recipe, dataset, policyOptimization: null };\n}\nimport { validateTasksetPackage } from \"./taskset-package-contracts.js\";\n\n/** Saved defaults do not authorize execution. The Run review still owns the\n * budget, runtime admission and exact training/evaluation population checks. */\nexport function prepareModelTrainingDefaults(input: {\n setup: ModelProjectTrainingSetup;\n package: unknown;\n}): ModelProjectTrainingSetup {\n const setup = ModelProjectTrainingSetupSchema.parse(input.setup);\n const portable = typeof input.package === \"object\" && input.package !== null\n && \"schemaVersion\" in input.package && input.package.schemaVersion === \"openpond.tasksetPackage.v1\"\n ? validateTasksetPackage(input.package) : null;\n const bound = portable ? null : validateModelTasksetPackage(input.package);\n const source = portable ?? bound!;\n const ref = setup.tasksetRef;\n const selected = ref && ref.revision === source.taskset.revision && (portable\n ? (ref.id === portable.taskset.id && ref.contentHash === portable.taskset.contentHash)\n || (ref.id === portable.taskset.metadata.sourceTasksetId && ref.contentHash === portable.taskset.metadata.sourceTasksetHash)\n : ref.id === source.taskset.id);\n if (!selected) return setup;\n if (!setup.evaluationTasksetRef && source.taskset.tasks.some(task => task.split === \"frozen_eval\" || task.split === \"validation\")) {\n setup.evaluationTasksetRef = setup.tasksetRef;\n }\n const base = setup.baseModel;\n if (setup.method === \"sft\") {\n if ((setup.recipe && setup.recipe.method !== \"sft\") || !base?.revision\n || !base.tokenizerRevision || !base.chatTemplateHash) return setup;\n const training = source.taskset.tasks.filter(task => task.split === \"train\");\n if (!training.length) return setup;\n const recipe = createSupervisedTrainingRecipeDefaults(setup.recipe, base);\n const dataset = fields(recipe.dataset);\n const sameEvaluation = setup.evaluationTasksetRef?.id === setup.tasksetRef?.id\n && setup.evaluationTasksetRef?.contentHash === setup.tasksetRef?.contentHash;\n if (!dataset.validationSplit && !sameEvaluation)\n throw new Error(\"Choose the held-out split from the selected evaluation dataset.\");\n return ModelProjectTrainingSetupSchema.parse({\n ...setup,\n recipe: ManagedSftRecipeSchema.parse({\n ...recipe,\n baseModel: { id: base.modelId, revision: base.revision,\n tokenizerRevision: base.tokenizerRevision, chatTemplateHash: base.chatTemplateHash },\n dataset: { ...dataset, trainSplit: \"train\",\n validationSplit: dataset.validationSplit ?? (source.taskset.tasks.some(task => task.split === \"frozen_eval\") ? \"frozen_eval\" : \"validation\"),\n maxExamples: typeof dataset.maxExamples === \"number\" ? Math.min(dataset.maxExamples, training.length) : Math.min(1_000, training.length) },\n }),\n });\n }\n if (setup.method !== \"grpo\" || (setup.recipe && setup.recipe.method !== \"grpo\") || !base?.revision\n || !base.tokenizerRevision || !base.chatTemplateHash) return setup;\n // Existing bound recipes retain their exact explicit settings and the\n // compiler's absent-field semantics. Only an unbound authoring draft needs\n // package-derived defaults; source changes explicitly invalidate bindings.\n if (setup.recipe?.baseModel && setup.recipe.reward && setup.recipe.dataset) return setup;\n const training = source.taskset.tasks.filter(task => task.split === \"train\");\n const graders = portable ? portable.taskset.graders : compileBoundGraders(bound!.rewardBinding, bound!.rewards);\n const grader = graders.find(candidate => candidate.rewardEligible && candidate.weight > 0);\n const environment = portable?.environment ?? bound?.executionResources?.environment ?? bound?.execution?.environment;\n if (!training.length || !grader || !environment) return setup;\n const recipe = createModelTrainingRecipeDefaults(setup.recipe);\n return ModelProjectTrainingSetupSchema.parse({\n ...setup,\n recipe: {\n ...recipe,\n baseModel: { id: base.modelId, revision: base.revision,\n tokenizerRevision: base.tokenizerRevision, chatTemplateHash: base.chatTemplateHash },\n dataset: { trainSplit: \"train\", validationSplit: source.taskset.tasks.some(task => task.split === \"frozen_eval\") ? \"frozen_eval\" : \"validation\",\n maxPromptTokens: 4_096, maxExamples: Math.min(1_000, training.length), selectionStrategy: \"stable_hash_top_n\", ...fields(recipe.dataset) },\n rollout: { maxTurns: source.taskset.environment.kind === \"text\" ? 1 : 15, ...fields(recipe.rollout) },\n reward: { graderId: grader.id, graderHash: contentHash(graders),\n environmentId: environment.id, environmentVersion: String(environment.revision),\n toolContractHash: contentHash(source.taskset.tools), learnedPreference: fields(recipe.reward).learnedPreference ?? null },\n },\n });\n}\n","import type { ModelProjectTrainingSetup } from \"./model-projects.js\";\n\ntype Recipe = NonNullable<ModelProjectTrainingSetup[\"recipe\"]>;\nconst fields = (value: unknown): Record<string, unknown> =>\n value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown> : {};\n\n// Exact-source authoring settings only. Availability is determined by the\n// connected service when preparing a run, never by these editable defaults.\nconst denseSources = [\n { id: \"Qwen/Qwen3.5-4B\", revision: \"851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a\",\n chatTemplateHash: \"a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715\", rank: 16, memoryBytes: 24_000_000_000 },\n { id: \"Qwen/Qwen3.5-9B\", revision: \"c202236235762e1c871ad0ccb60c8ee5ba337b9a\",\n chatTemplateHash: \"a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715\", rank: 16, memoryBytes: 48_000_000_000 },\n { id: \"Qwen/Qwen3.8-27B\", revision: \"1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0\",\n chatTemplateHash: \"c3cf9e34abf4f9e36c2d72165aa9c132d3e2a725b6c2586aaa3a8af9d7a81041\", rank: 8, memoryBytes: 80_000_000_000 },\n] as const;\n\n/** An editable draft, without invented model or dataset bindings. Execution\n * still requires ManagedSftRecipeSchema and authoritative supervised admission. */\nexport function createSupervisedTrainingRecipeDefaults(\n saved?: ModelProjectTrainingSetup[\"recipe\"],\n baseModel?: ModelProjectTrainingSetup[\"baseModel\"],\n): Recipe {\n const source = saved?.method === \"sft\" ? saved : undefined;\n const base = baseModel ? { id: baseModel.modelId, revision: baseModel.revision,\n tokenizerRevision: baseModel.tokenizerRevision, chatTemplateHash: baseModel.chatTemplateHash } : fields(source?.baseModel);\n const dense = denseSources.find(candidate => candidate.id === base.id && candidate.revision === base.revision\n && candidate.revision === base.tokenizerRevision && candidate.chatTemplateHash === base.chatTemplateHash);\n const rank = dense?.rank ?? 16;\n return {\n schemaVersion: \"openpond.sftRecipe.v1\", method: \"sft\", parameterization: \"lora\",\n ...(source?.evaluation ? { evaluation: source.evaluation } : {}),\n ...(source?.baseModel ? { baseModel: source.baseModel } : {}),\n dataset: {\n completionOnly: true, maxSequenceLength: 8_192,\n selectionStrategy: \"stable_hash_top_n\", selectionSeed: 17,\n ...fields(source?.dataset),\n },\n lora: {\n rank, alpha: rank * 2, dropout: 0,\n targetModules: dense ? [\"down_proj\", \"gate_proj\", \"up_proj\"]\n : [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n ...fields(source?.lora),\n },\n optimizer: {\n learningRate: 0.0001, epochs: 3, maxSteps: 30,\n batchSize: 1, gradientAccumulationSteps: 1, seed: 17,\n ...fields(source?.optimizer),\n },\n resourceLimits: {\n cpuThreads: 4, memoryBytes: dense?.memoryBytes ?? 48 * 1024 ** 3, wallTimeMs: 60 * 60 * 1_000,\n ...fields(source?.resourceLimits),\n },\n };\n}\n"],"mappings":"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","names":["compileBoundGraders","fields","training","recipe","reward","task","contentHash","compileBoundGraders","value","asset"]}