openpond-sdk 0.12.24 → 0.12.26

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 (231) hide show
  1. package/LEARNING.md +5 -7
  2. package/OPENTELEMETRY.md +1 -1
  3. package/PRODUCT_INTEGRATION.md +129 -0
  4. package/README.md +13 -3
  5. package/SERVERLESS_SERVING.md +37 -0
  6. package/TASKSETS.md +1 -2
  7. package/TASK_INGESTION.md +87 -86
  8. package/TRAINING_PROTOCOL.md +7 -3
  9. package/TRAINING_WORKFLOWS.md +11 -6
  10. package/dist/advanced-refiner-evaluations.js +10 -9
  11. package/dist/ai-sdk.js +225 -0
  12. package/dist/ai-sdk.js.map +1 -0
  13. package/dist/candidate-evaluations.js +7 -6
  14. package/dist/{chunk-ZQFROKKS.js → chunk-2U6BQ5C4.js} +3 -3
  15. package/dist/{chunk-BNBPKCIR.js → chunk-3BILL33A.js} +4 -4
  16. package/dist/{chunk-3B5KSH3V.js → chunk-456F3BXD.js} +5 -2
  17. package/dist/chunk-456F3BXD.js.map +1 -0
  18. package/dist/{chunk-GCUWJUUM.js → chunk-4A4FNG4R.js} +2 -2
  19. package/dist/{chunk-EZME7DV4.js → chunk-4CDLPMJK.js} +2 -2
  20. package/dist/{chunk-SP7DQEQM.js → chunk-4CRLQMJ2.js} +5 -5
  21. package/dist/{chunk-QOX57Y27.js → chunk-4PEK3YOW.js} +6 -3
  22. package/dist/chunk-4PEK3YOW.js.map +1 -0
  23. package/dist/{chunk-GS5HEE4M.js → chunk-4REK5TTE.js} +2 -2
  24. package/dist/{chunk-AG6UJ3DI.js → chunk-57ROW3XF.js} +3 -3
  25. package/dist/{chunk-3BYFS4RO.js → chunk-6LVLWRBJ.js} +11 -8
  26. package/dist/chunk-6LVLWRBJ.js.map +1 -0
  27. package/dist/{chunk-3VUF5H3B.js → chunk-AMZ2SWHR.js} +2 -2
  28. package/dist/{chunk-ZQ6QTYRE.js → chunk-AQV7RQZH.js} +11 -11
  29. package/dist/{chunk-ZQ6QTYRE.js.map → chunk-AQV7RQZH.js.map} +1 -1
  30. package/dist/{chunk-BJMENXR4.js → chunk-C7I4ZG6Q.js} +3 -3
  31. package/dist/{chunk-JMFYNIYZ.js → chunk-CAOMKM55.js} +6 -3
  32. package/dist/chunk-CAOMKM55.js.map +1 -0
  33. package/dist/{chunk-QNOCM5JX.js → chunk-D26RJQU7.js} +2 -2
  34. package/dist/{chunk-GBDBKGXW.js → chunk-EL6KZO43.js} +3 -3
  35. package/dist/{chunk-MVAEE5EI.js → chunk-H5KHLBC5.js} +5 -2
  36. package/dist/chunk-H5KHLBC5.js.map +1 -0
  37. package/dist/{chunk-7G47YXQT.js → chunk-HCUZYGUK.js} +8 -5
  38. package/dist/chunk-HCUZYGUK.js.map +1 -0
  39. package/dist/{chunk-Q4RGCEOI.js → chunk-JINWKUKR.js} +3 -3
  40. package/dist/{chunk-626JLH4D.js → chunk-JWEIAEQ6.js} +2 -2
  41. package/dist/{chunk-DH6O4JFB.js → chunk-KJTX4A27.js} +5 -2
  42. package/dist/chunk-KJTX4A27.js.map +1 -0
  43. package/dist/{chunk-OBI2MQYU.js → chunk-MN4FE52A.js} +17 -14
  44. package/dist/chunk-MN4FE52A.js.map +1 -0
  45. package/dist/{chunk-NZRGRUYG.js → chunk-MUG4OQKL.js} +21 -7
  46. package/dist/chunk-MUG4OQKL.js.map +1 -0
  47. package/dist/{chunk-C3TS766N.js → chunk-N6LGT7NT.js} +5 -2
  48. package/dist/chunk-N6LGT7NT.js.map +1 -0
  49. package/dist/{chunk-QIGMNB6M.js → chunk-P56JWQYV.js} +3 -3
  50. package/dist/{chunk-GX6KMHW2.js → chunk-QKLZZOZD.js} +5 -2
  51. package/dist/chunk-QKLZZOZD.js.map +1 -0
  52. package/dist/chunk-QYWPNNP3.js +9 -0
  53. package/dist/chunk-QYWPNNP3.js.map +1 -0
  54. package/dist/{chunk-QCRNQMN4.js → chunk-UZAVG2WK.js} +5 -5
  55. package/dist/chunk-UZAVG2WK.js.map +1 -0
  56. package/dist/{chunk-Z252BNAZ.js → chunk-VE5JD5FN.js} +6 -2
  57. package/dist/chunk-VE5JD5FN.js.map +1 -0
  58. package/dist/{chunk-7F43U2NC.js → chunk-WZKKQNYY.js} +3 -3
  59. package/dist/{chunk-6EZAGTZG.js → chunk-X5AT253K.js} +5 -5
  60. package/dist/{chunk-ZRTNR4U7.js → chunk-XWUTYFOU.js} +3 -3
  61. package/dist/{chunk-KEG5QS7W.js → chunk-XYK3MAIC.js} +193 -193
  62. package/dist/chunk-XYK3MAIC.js.map +1 -0
  63. package/dist/chunk-ZG4HVCJB.js +248 -0
  64. package/dist/chunk-ZG4HVCJB.js.map +1 -0
  65. package/dist/connected-evidence.js +11 -10
  66. package/dist/dataset-commerce.js +4 -1
  67. package/dist/dataset-commerce.js.map +1 -1
  68. package/dist/dataset-marketplace.js +4 -1
  69. package/dist/dataset-marketplace.js.map +1 -1
  70. package/dist/dataset-workspaces.js +157 -93
  71. package/dist/dataset-workspaces.js.map +1 -1
  72. package/dist/errors.js +2 -1
  73. package/dist/experiment-evaluation-schedules.js +20 -19
  74. package/dist/experiment-improvements.js +8 -7
  75. package/dist/experiments.js +21 -20
  76. package/dist/human-review.js +2 -1
  77. package/dist/index.js +87 -56
  78. package/dist/index.js.map +1 -1
  79. package/dist/learning.js +6 -3
  80. package/dist/learning.js.map +1 -1
  81. package/dist/model-projects.js +2 -1
  82. package/dist/model-starter-attempts.js +3 -2
  83. package/dist/model-starter-catalog.js +7 -4
  84. package/dist/model-starter-catalog.js.map +1 -1
  85. package/dist/model-starters.js +4 -3
  86. package/dist/model-taskset-runs.js +7 -4
  87. package/dist/model-taskset-runs.js.map +1 -1
  88. package/dist/post-training.js +7 -6
  89. package/dist/taskset-catalog.js +2 -1
  90. package/dist/taskset-drafts.js +13 -10
  91. package/dist/taskset-drafts.js.map +1 -1
  92. package/dist/taskset-packages.js +16 -15
  93. package/dist/tool-learning.js +4 -1
  94. package/dist/tool-learning.js.map +1 -1
  95. package/dist/training-bundle.js +19 -18
  96. package/dist/training-bundle.js.map +1 -1
  97. package/dist/training-hardware.js +3 -2
  98. package/dist/training-projects.js +4 -1
  99. package/dist/training-projects.js.map +1 -1
  100. package/dist/training.js +2761 -2626
  101. package/dist/training.js.map +1 -1
  102. package/dist/types/packages/sdk/src/ai-sdk.d.ts +6 -0
  103. package/dist/types/packages/sdk/src/ai-sdk.d.ts.map +1 -0
  104. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts +21 -21
  105. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +1 -1
  106. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts.map +1 -1
  107. package/dist/types/packages/sdk/src/connected-sync.d.ts +1 -1
  108. package/dist/types/packages/sdk/src/connected-sync.d.ts.map +1 -1
  109. package/dist/types/packages/sdk/src/dataset-commerce.d.ts +1 -1
  110. package/dist/types/packages/sdk/src/dataset-commerce.d.ts.map +1 -1
  111. package/dist/types/packages/sdk/src/dataset-marketplace.d.ts +1 -1
  112. package/dist/types/packages/sdk/src/dataset-marketplace.d.ts.map +1 -1
  113. package/dist/types/packages/sdk/src/dataset-population.d.ts +1 -1
  114. package/dist/types/packages/sdk/src/dataset-population.d.ts.map +1 -1
  115. package/dist/types/packages/sdk/src/dataset-preparation-client.d.ts +1 -1
  116. package/dist/types/packages/sdk/src/dataset-preparation-client.d.ts.map +1 -1
  117. package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts +9 -2
  118. package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts.map +1 -1
  119. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +141 -141
  120. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  121. package/dist/types/packages/sdk/src/dataset-workspace-error.d.ts +28 -0
  122. package/dist/types/packages/sdk/src/dataset-workspace-error.d.ts.map +1 -0
  123. package/dist/types/packages/sdk/src/dataset-workspaces.d.ts +1 -0
  124. package/dist/types/packages/sdk/src/dataset-workspaces.d.ts.map +1 -1
  125. package/dist/types/packages/sdk/src/endpoints.d.ts +4 -0
  126. package/dist/types/packages/sdk/src/endpoints.d.ts.map +1 -0
  127. package/dist/types/packages/sdk/src/evaluation-coordination-http.d.ts +1 -1
  128. package/dist/types/packages/sdk/src/evaluation-coordination-http.d.ts.map +1 -1
  129. package/dist/types/packages/sdk/src/experiment-client.d.ts +637 -637
  130. package/dist/types/packages/sdk/src/experiment-client.d.ts.map +1 -1
  131. package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts +28 -28
  132. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts +28 -28
  133. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1623 -1623
  134. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts.map +1 -1
  135. package/dist/types/packages/sdk/src/experiment-inspection.d.ts +1 -1
  136. package/dist/types/packages/sdk/src/experiment-inspection.d.ts.map +1 -1
  137. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +7 -7
  138. package/dist/types/packages/sdk/src/grader-inspection.d.ts +1 -1
  139. package/dist/types/packages/sdk/src/grader-inspection.d.ts.map +1 -1
  140. package/dist/types/packages/sdk/src/human-review-client.d.ts +1 -1
  141. package/dist/types/packages/sdk/src/human-review-client.d.ts.map +1 -1
  142. package/dist/types/packages/sdk/src/index.d.ts +13 -4
  143. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  144. package/dist/types/packages/sdk/src/learning-client.d.ts +1 -1
  145. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
  146. package/dist/types/packages/sdk/src/learning-correction-metrics.d.ts +1 -1
  147. package/dist/types/packages/sdk/src/learning-correction-metrics.d.ts.map +1 -1
  148. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts +347 -347
  149. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +25 -25
  150. package/dist/types/packages/sdk/src/model-projects.d.ts +1 -1
  151. package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
  152. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts +1 -1
  153. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts.map +1 -1
  154. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts +1 -1
  155. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts.map +1 -1
  156. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +29 -29
  157. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts.map +1 -1
  158. package/dist/types/packages/sdk/src/post-training.d.ts +7 -7
  159. package/dist/types/packages/sdk/src/product-model-response.d.ts +4 -0
  160. package/dist/types/packages/sdk/src/product-model-response.d.ts.map +1 -0
  161. package/dist/types/packages/sdk/src/product-models.d.ts +76 -0
  162. package/dist/types/packages/sdk/src/product-models.d.ts.map +1 -0
  163. package/dist/types/packages/sdk/src/profile-evaluation-discovery.d.ts +1 -1
  164. package/dist/types/packages/sdk/src/profile-evaluation-discovery.d.ts.map +1 -1
  165. package/dist/types/packages/sdk/src/serverless-serving.d.ts +157 -0
  166. package/dist/types/packages/sdk/src/serverless-serving.d.ts.map +1 -0
  167. package/dist/types/packages/sdk/src/steering-model-serving.d.ts +276 -0
  168. package/dist/types/packages/sdk/src/steering-model-serving.d.ts.map +1 -1
  169. package/dist/types/packages/sdk/src/taskset-catalog.d.ts +1 -1
  170. package/dist/types/packages/sdk/src/taskset-catalog.d.ts.map +1 -1
  171. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +121 -121
  172. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  173. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +20 -20
  174. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +1 -1
  175. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  176. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
  177. package/dist/types/packages/sdk/src/tool-learning-client.d.ts +1 -1
  178. package/dist/types/packages/sdk/src/tool-learning-client.d.ts.map +1 -1
  179. package/dist/types/packages/sdk/src/training-evidence.d.ts +54 -0
  180. package/dist/types/packages/sdk/src/training-evidence.d.ts.map +1 -0
  181. package/dist/types/packages/sdk/src/training-harness-sources.d.ts +2 -2
  182. package/dist/types/packages/sdk/src/training-model-serving-control.d.ts +232 -0
  183. package/dist/types/packages/sdk/src/training-model-serving-control.d.ts.map +1 -1
  184. package/dist/types/packages/sdk/src/training-model-serving.d.ts +552 -0
  185. package/dist/types/packages/sdk/src/training-model-serving.d.ts.map +1 -1
  186. package/dist/types/packages/sdk/src/training-project-client.d.ts +1 -1
  187. package/dist/types/packages/sdk/src/training-project-client.d.ts.map +1 -1
  188. package/dist/types/packages/sdk/src/training-transport.d.ts +1 -1
  189. package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -1
  190. package/dist/types/packages/sdk/src/training.d.ts +2489 -2148
  191. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  192. package/dist/types/packages/sdk/src/types.d.ts +14 -1
  193. package/dist/types/packages/sdk/src/types.d.ts.map +1 -1
  194. package/examples/learning/submit.py +1 -1
  195. package/examples/learning/submit.ts +2 -2
  196. package/examples/training/continual.ts +4 -4
  197. package/examples/training/manual.ts +1 -3
  198. package/fixtures/personalized-inference-request.schema.json +316 -0
  199. package/fixtures/python-foundation/schemas.json +4873 -4484
  200. package/package.json +19 -3
  201. package/dist/chunk-3B5KSH3V.js.map +0 -1
  202. package/dist/chunk-3BYFS4RO.js.map +0 -1
  203. package/dist/chunk-7G47YXQT.js.map +0 -1
  204. package/dist/chunk-C3TS766N.js.map +0 -1
  205. package/dist/chunk-DH6O4JFB.js.map +0 -1
  206. package/dist/chunk-GX6KMHW2.js.map +0 -1
  207. package/dist/chunk-JMFYNIYZ.js.map +0 -1
  208. package/dist/chunk-KEG5QS7W.js.map +0 -1
  209. package/dist/chunk-MVAEE5EI.js.map +0 -1
  210. package/dist/chunk-NZRGRUYG.js.map +0 -1
  211. package/dist/chunk-OBI2MQYU.js.map +0 -1
  212. package/dist/chunk-QCRNQMN4.js.map +0 -1
  213. package/dist/chunk-QOX57Y27.js.map +0 -1
  214. package/dist/chunk-Z252BNAZ.js.map +0 -1
  215. /package/dist/{chunk-ZQFROKKS.js.map → chunk-2U6BQ5C4.js.map} +0 -0
  216. /package/dist/{chunk-BNBPKCIR.js.map → chunk-3BILL33A.js.map} +0 -0
  217. /package/dist/{chunk-GCUWJUUM.js.map → chunk-4A4FNG4R.js.map} +0 -0
  218. /package/dist/{chunk-EZME7DV4.js.map → chunk-4CDLPMJK.js.map} +0 -0
  219. /package/dist/{chunk-SP7DQEQM.js.map → chunk-4CRLQMJ2.js.map} +0 -0
  220. /package/dist/{chunk-GS5HEE4M.js.map → chunk-4REK5TTE.js.map} +0 -0
  221. /package/dist/{chunk-AG6UJ3DI.js.map → chunk-57ROW3XF.js.map} +0 -0
  222. /package/dist/{chunk-3VUF5H3B.js.map → chunk-AMZ2SWHR.js.map} +0 -0
  223. /package/dist/{chunk-BJMENXR4.js.map → chunk-C7I4ZG6Q.js.map} +0 -0
  224. /package/dist/{chunk-QNOCM5JX.js.map → chunk-D26RJQU7.js.map} +0 -0
  225. /package/dist/{chunk-GBDBKGXW.js.map → chunk-EL6KZO43.js.map} +0 -0
  226. /package/dist/{chunk-Q4RGCEOI.js.map → chunk-JINWKUKR.js.map} +0 -0
  227. /package/dist/{chunk-626JLH4D.js.map → chunk-JWEIAEQ6.js.map} +0 -0
  228. /package/dist/{chunk-QIGMNB6M.js.map → chunk-P56JWQYV.js.map} +0 -0
  229. /package/dist/{chunk-7F43U2NC.js.map → chunk-WZKKQNYY.js.map} +0 -0
  230. /package/dist/{chunk-6EZAGTZG.js.map → chunk-X5AT253K.js.map} +0 -0
  231. /package/dist/{chunk-ZRTNR4U7.js.map → chunk-XWUTYFOU.js.map} +0 -0
package/LEARNING.md CHANGED
@@ -11,7 +11,7 @@ formats first. The sample uses an input object with `question` and an output
11
11
  object with `answer`; adapt the record to your published format. The scripts read
12
12
  the source's exact task-definition reference from the server.
13
13
 
14
- Set `OPENPOND_API_KEY`, `OPENPOND_API_URL` and `OPENPOND_LEARNING_SCOPE` in your
14
+ Set `OPENPOND_API_KEY` and `OPENPOND_LEARNING_SCOPE` in your
15
15
  shell, then run one of:
16
16
 
17
17
  ```sh
@@ -19,12 +19,10 @@ node --experimental-strip-types submit.ts SOURCE_ID example.json
19
19
  python3 submit.py SOURCE_ID example.json
20
20
  ```
21
21
 
22
- Use the URL of the execution owner: a local OpenPond server or the hosted API
23
- where the learning service is deployed. The server authorizes the requested
24
- profile/team scope. The SDK and Python example send the selected scope in
25
- `X-OpenPond-Team-Id` so hosted requests select that team before authorization;
26
- the local server uses the profile scope in the request body. These variables are example configuration, not arguments
27
- that should be committed with credentials.
22
+ The SDK connects to OpenPond automatically. The server authorizes the requested
23
+ workspace scope. The SDK and Python example send that scope in
24
+ `X-OpenPond-Team-Id`. Keep credentials in your application's secret configuration.
25
+ Do not commit their values.
28
26
 
29
27
  Assign stable example/attempt identities and preserve `idempotencyKey`, timestamp
30
28
  and content on retries. A different record must use a different key. Submission
package/OPENTELEMETRY.md CHANGED
@@ -19,7 +19,7 @@ import { OpenPondClient } from "openpond-sdk";
19
19
  import { OpenPondSpanExporter } from "openpond-sdk/opentelemetry";
20
20
  import { BatchSpanProcessor, TracerProvider } from "@opentelemetry/sdk-trace";
21
21
 
22
- const client = new OpenPondClient({ baseUrl: apiBaseUrl, apiKey, teamId });
22
+ const client = new OpenPondClient({ apiKey, teamId });
23
23
  const exporter = new OpenPondSpanExporter({
24
24
  client,
25
25
  datasetId,
@@ -0,0 +1,129 @@
1
+ # Use OpenPond in your product
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
+
8
+ Configure one application-owned server client. Bind aliases to exact callable
9
+ Model IDs from your serving destination:
10
+
11
+ ```ts
12
+ import { createOpenPondClient } from "openpond-sdk";
13
+
14
+ export const openpond = createOpenPondClient({
15
+ apiKey: process.env.OPENPOND_API_KEY!,
16
+ teamId: process.env.OPENPOND_TEAM_ID!,
17
+ datasetId: process.env.OPENPOND_DATASET_ID!,
18
+ models: { support: process.env.OPENPOND_MODEL_ID! },
19
+ });
20
+
21
+ const answer = await openpond.models.support.generate({ prompt: "How do I rotate a token?" });
22
+ console.log(answer.text, answer.requestId, answer.usage);
23
+ ```
24
+
25
+ The SDK connects to OpenPond with your API key for task submission and personalized
26
+ inference. Use a key authorized for the selected Dataset and Model. A Dataset-only
27
+ producer key cannot invoke inference. Bind the exact callable Model ID; no
28
+ catalogue default or substitute Model is selected. Naming a Model never activates serving, approves a
29
+ candidate, starts training, or automatically captures inference as a task.
30
+ Decision scorers use their separate typed scoring APIs.
31
+
32
+ `generate` accepts either `prompt` or text `messages`, plus optional `temperature`,
33
+ `maxTokens` and `signal`. Results include `text`, `requestId`, requested `modelId`,
34
+ server-reported `resolvedModelId`, `finishReason`, nullable `usage`, and nullable
35
+ `systemFingerprint`, plus retained server `evidence` when supplied. Evidence
36
+ presence is not client-side verification. Core handles are text APIs; tools need
37
+ the supported integration and explicit capabilities. The current personalized API
38
+ rejects multimodal and structured-output modes. Aliases are typed TypeScript
39
+ properties; multiple clients remain independent.
40
+
41
+ ```ts
42
+ for await (const event of openpond.models.support.stream({ prompt: "Explain token rotation" })) {
43
+ if (event.type === "text") process.stdout.write(event.text);
44
+ else console.log(event.result.usage);
45
+ }
46
+ ```
47
+
48
+ Breaking the iteration cancels the response. An interrupted stream raises
49
+ `ProductModelError` and never emits a successful `finish`. It may already have
50
+ incurred usage; inference is never automatically replayed. `serving.timeoutMs`
51
+ defaults to 60 seconds and accepts at most 300 seconds. Supply a caller abort
52
+ signal to cancel an individual request. Text requests are bounded to 1 MiB and
53
+ results to 8 MiB; individual stream frames to 1 MiB.
54
+
55
+ Await task delivery separately with `openpond.addTask(...)`. If inference succeeds
56
+ and optional task delivery fails, preserve both outcomes rather than discarding
57
+ the delivery error or pretending the answer failed. See [task ingestion](TASK_INGESTION.md).
58
+
59
+ ## Python sync and async
60
+
61
+ ```python
62
+ from ponder_sdk import AsyncClient
63
+
64
+ async with AsyncClient(
65
+ api_key=api_key, team_id=team_id,
66
+ dataset_id=dataset_id,
67
+ model_aliases={"support": model_id},
68
+ ) as openpond:
69
+ answer = await openpond.models.support.generate(prompt="How do I rotate a token?")
70
+ print(answer.text, answer.request_id, answer.usage)
71
+ await openpond.add_task({"id": event_id, "name": "Token rotation", "input": {"question": question}})
72
+ async for event in openpond.models.support.stream(prompt="Explain the steps"):
73
+ if event.type == "text":
74
+ print(event.text, end="")
75
+ ```
76
+
77
+ `Client` has the same configuration and synchronous calls/iteration. Named aliases
78
+ augment existing Model administration methods; choose aliases that don't collide
79
+ with those methods. Bracket access (`openpond.models["support"]`) is also available.
80
+ Inference shares the existing client's HTTP pool and timeout. Close partially
81
+ consumed iterators (or use `contextlib.closing`/`aclosing`) to release streams
82
+ promptly. Native async cancellation propagates. No SDK queues or flush calls exist.
83
+
84
+ ## Optional Vercel AI SDK 7 integration
85
+
86
+ Install `ai@^7.0.165` and `@ai-sdk/openai-compatible@^3.0.87` alongside OpenPond.
87
+ Only the `openpond-sdk/ai-sdk` entry point imports the optional provider; task
88
+ submission has no Vercel dependency. This adapter targets LanguageModelV4 and is
89
+ not an upgrade of an application's existing AI SDK 4/5/6 installation.
90
+
91
+ ```ts
92
+ import { generateText, streamText } from "ai";
93
+ import { toAIModel } from "openpond-sdk/ai-sdk";
94
+ import { openpond } from "./openpond.server.js";
95
+
96
+ const model = toAIModel(openpond.models.support);
97
+ const answer = await generateText({ model, prompt: "Explain token rotation", maxRetries: 0 });
98
+
99
+ // Inside an authenticated product backend route:
100
+ export async function POST(request: Request) {
101
+ // Authenticate the product user and validate/limit this payload first.
102
+ const { prompt } = await request.json();
103
+ const result = streamText({ model, prompt, abortSignal: request.signal, maxRetries: 0 });
104
+ return result.toUIMessageStreamResponse();
105
+ }
106
+ ```
107
+
108
+ Use the AI SDK 7 React `useChat`/transport recipe against your own authenticated
109
+ backend. Never place the OpenPond client or secrets in browser code. AI SDK's UI
110
+ stream response is different from raw OpenAI SSE; use
111
+ `toUIMessageStreamResponse()` rather than forwarding raw SSE into `useChat`.
112
+
113
+ The official compatible provider handles content/usage conversion, tool deltas and
114
+ stream cancellation. OpenPond gates features against the selected binding:
115
+
116
+ ```ts
117
+ models: {
118
+ support: {
119
+ id: process.env.OPENPOND_MODEL_ID!,
120
+ capabilities: { streaming: true, tools: true },
121
+ },
122
+ }
123
+ ```
124
+
125
+ Only enable tools after checking that exact deployment.
126
+ Defaults are streaming enabled and tools disabled. Structured-output and multimodal
127
+ inputs are rejected. Failed provider calls are surfaced as non-retryable SDK
128
+ errors to prevent implicit replay of billed requests. Explicit `maxRetries: 0`
129
+ also makes that intent visible in application code.
package/README.md CHANGED
@@ -20,7 +20,7 @@ Node.js 22.14 or newer is required. This package is server-only: never expose an
20
20
 
21
21
  `OpenPondExperimentsClient` from `openpond-sdk/experiments` admits one run and its
22
22
  immutable configuration with `run(configuration)`. It is also available as
23
- `createOpenPondClient({ apiKey, baseUrl }).experiments(teamId)`. The request includes
23
+ `createOpenPondClient({ apiKey }).experiments(teamId)`. The request includes
24
24
  one stable operation ID (also on its nested request), dataset/population,
25
25
  target/settings, selected graders and spending cap. Reuse the same operation ID
26
26
  after a transport failure; it returns the same Experiment without duplicate work.
@@ -67,7 +67,6 @@ export const maxDuration = 800;
67
67
 
68
68
  const openpond = createOpenPondClient({
69
69
  apiKey: process.env.OPENPOND_API_KEY!,
70
- baseUrl: process.env.OPENPOND_API_URL,
71
70
  });
72
71
 
73
72
  export async function POST(request: Request) {
@@ -392,4 +391,15 @@ not implicitly share a spending cap.
392
391
 
393
392
  ## Add production tasks
394
393
 
395
- Use the flat `client.addTask(datasetId, task)` operation, or bind one destination with `createTaskAdder` and call `addTask(task)`. See [task ingestion](TASK_INGESTION.md) for TypeScript/Python examples, receipt semantics and duplicate-safe retries. Task uploads do not enable training.
394
+ Configure `datasetId` once and await `client.addTask({ id: sourceEventId, name, input })`. Use `client.dataset(otherDatasetId).addTask(task)` for another destination. See [task ingestion](TASK_INGESTION.md) for TypeScript/Python examples, receipt semantics and duplicate-safe retries. Task uploads do not enable training.
395
+
396
+ Dataset workspace HTTP failures throw `DatasetWorkspaceRequestError` from
397
+ `openpond-sdk/dataset-workspaces`, with `status`, an allowlisted `code`,
398
+ `retryable`, and `outcomeUnknown`. Messages contain fixed recovery guidance;
399
+ raw server diagnostics are discarded. `retryable` does not trigger an automatic
400
+ retry. When `outcomeUnknown` is true, retain the original operation ID and request
401
+ bytes, recover its receipt with `operationResult`, or retry the identical request.
402
+
403
+ ## Add OpenPond to a product
404
+
405
+ Configure named personalized Model handles with `models` and your API key, then call `client.models.support.generate({ prompt })` or iterate `stream({ prompt })`. See [product integration](PRODUCT_INTEGRATION.md) for TypeScript, Python, React/backend and optional Vercel AI SDK 7 examples. Inference never activates serving or automatically captures tasks.
@@ -0,0 +1,37 @@
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.
7
+
8
+ 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.
package/TASKSETS.md CHANGED
@@ -8,7 +8,6 @@ optional Model Project attachment filtering before returning records.
8
8
  import { OpenPondTasksetCatalogClient } from "openpond-sdk/taskset-catalog";
9
9
 
10
10
  const tasksets = new OpenPondTasksetCatalogClient({
11
- baseUrl: "https://api.openpond.ai",
12
11
  apiKey,
13
12
  teamId,
14
13
  });
@@ -262,7 +261,7 @@ Imported source still requires explicit source review before publication.
262
261
 
263
262
  `OpenPondTasksetDraftClient` from `openpond-sdk/taskset-drafts` defines the
264
263
  scoped `/v1/models/:modelId/taskset-drafts` protocol. Construct it in server code
265
- with `baseUrl`, `apiKey` and `teamId`. It supports source inspection,
264
+ with `apiKey` and `teamId`. It supports source inspection,
266
265
  initialization, listing, document/file reads and edits, explicit Model refresh,
267
266
  validation, publication and deletion. Hosting these endpoints requires a server
268
267
  implementation; exporting this client alone does not make them available.
package/TASK_INGESTION.md CHANGED
@@ -1,135 +1,136 @@
1
1
  # Add tasks to a Dataset
2
2
 
3
- Task submission uses an authenticated OpenPond API, separate from OpenTelemetry.
4
- A successful receipt means a structured task was durably saved and is available
5
- through the ordinary Dataset Tasks reader. It does not start training, publish
6
- a release, create a Model or enable a collection schedule.
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.
7
6
 
8
- Create or choose an editable Dataset in Console and copy its ID. Configure the
9
- server-side SDK with the workspace that owns it:
7
+
8
+ Configure a client once in your product's server module. Submit one structured
9
+ source event with `await addTask(task)`:
10
10
 
11
11
  ```ts
12
12
  import { createOpenPondClient } from "openpond-sdk";
13
13
 
14
- const client = createOpenPondClient({
14
+ export const openpond = createOpenPondClient({
15
15
  apiKey: process.env.OPENPOND_API_KEY!,
16
16
  teamId: process.env.OPENPOND_TEAM_ID!,
17
+ datasetId: process.env.OPENPOND_DATASET_ID!,
17
18
  });
18
19
 
19
- const receipt = await client.addTask(process.env.OPENPOND_DATASET_ID!, {
20
+ const receipt = await openpond.addTask({
21
+ id: sourceEventId,
20
22
  name: "Handle an expired API token",
21
23
  input: { request: "Fetch the report", observedError: "Token expired" },
22
- source: { kind: "production_agent", eventId: "run-123" },
23
- }, { idempotencyKey: "run-123" });
24
-
24
+ source: { kind: "production_agent", eventId: sourceEventId },
25
+ });
25
26
  console.log(receipt.taskId, receipt.receivedAt);
26
27
  ```
27
28
 
28
- Use a configured `baseUrl` when targeting a different OpenPond API origin.
29
- Never expose the API key in browser code or logged task content.
30
-
31
- ## Bind the destination once
29
+ The client connects to OpenPond automatically and keeps its own credentials;
30
+ no mutable global account is used. For an explicit alternate Dataset:
32
31
 
33
32
  ```ts
34
- import { createTaskAdder } from "openpond-sdk";
35
-
36
- const addTask = createTaskAdder({
37
- apiKey: process.env.OPENPOND_API_KEY!,
38
- teamId: process.env.OPENPOND_TEAM_ID!,
39
- datasetId: process.env.OPENPOND_DATASET_ID!,
40
- baseUrl: "https://api.openpond.ai",
41
- });
42
-
43
- await addTask({
33
+ await openpond.dataset(otherDatasetId).addTask({
34
+ id: sourceEventId,
44
35
  name: "Explain a failed agent run",
45
36
  input: { request: "Summarize the report", outcome: "incomplete" },
46
- }, { idempotencyKey: "agent-run-456" });
37
+ });
47
38
  ```
48
39
 
49
- The Dataset ID is still included in every request. The helper binds it locally;
50
- it never uses a global account, last-selected Dataset or implicit Fix-it Model.
40
+ `addTask(datasetId, task)` and the `createTaskAdder` helper remain available.
51
41
 
52
- ## Input and receipt
42
+ ## Delivery, identity and retries
53
43
 
54
- Every task has a readable `name` and structured `input`. Optional fields are
55
- `expectedOutput`, `split`, `tags` and `source` (`kind`, `eventId`, `label`,
56
- `occurredAt`). The default split is `validation`. A `train` split alone does
57
- not authorize training. Keep a missing correct answer absent rather than
58
- replacing it with an error message.
44
+ A successful receipt confirms durable storage of the task and its processing
45
+ obligation. It does not wait for indexing, grading or training. Dataset projection
46
+ may lag acknowledgement. Await suspends this async function while the JavaScript
47
+ event loop continues handling other work. There is no SDK background queue,
48
+ flush command or permanent streaming connection.
59
49
 
60
- The complete request is bounded to 128 KiB. The receipt includes workspace,
61
- Dataset, task and operation identities, server `receivedAt`, saved revision,
62
- `state: "saved"` and `trainingUseAuthorized: false`. Source occurrence time is
63
- different from server upload time.
50
+ `id` identifies the source event within the workspace and Dataset. It is separate
51
+ from the server's canonical `receipt.taskId`. Repeating the same source ID and
52
+ content returns the original receipt; changed content conflicts instead of
53
+ silently overwriting. New credentials still need current authorization for that
54
+ exact Dataset. A successful upload grants no training permission.
64
55
 
65
- ## Delivery and retries
66
-
67
- Retain an explicit stable idempotency key for each source event. Repeating the
68
- same key and task in the same authorized destination returns the original
69
- receipt without inserting a duplicate. Reusing a key with different content is
70
- a conflict. Separate keys add separate tasks, including simultaneous writers.
71
-
72
- The SDK makes one request; it does not silently replay arbitrary mutations.
73
- When a response is lost, `DatasetTaskIngestionError.operationId` retains the
74
- operation identity and `outcomeUnknown` indicates that persistence could not be
75
- confirmed. Retry the original task with that same key. Do not generate a new
76
- key merely because the response was interrupted. A supplied abort signal is
77
- forwarded to the request; an interrupted response can still have been saved.
56
+ The SDK sends once. It never automatically replays a mutation. Preserve your
57
+ source ID and original content across uncertain outcomes:
78
58
 
79
59
  ```ts
80
60
  import { DatasetTaskIngestionError } from "openpond-sdk";
81
61
 
62
+ const task = { id: sourceEventId, name: "Expired token", input: { error: "expired" } };
82
63
  try {
83
- await addTask(task, { idempotencyKey: sourceEventId });
64
+ await openpond.addTask(task, { signal: request.signal, timeoutMs: 10_000 });
84
65
  } catch (error) {
85
66
  if (error instanceof DatasetTaskIngestionError && error.outcomeUnknown) {
86
- // Retain task + error.operationId privately for a later exact retry.
67
+ // Retain task and error.sourceId privately for a later exact retry.
87
68
  }
88
69
  throw error;
89
70
  }
90
71
  ```
91
72
 
92
- The underlying route is `POST /v1/dataset-workspaces/{datasetId}/tasks`, with
93
- `Authorization: Bearer …`, `X-OpenPond-Team-Id` and JSON:
94
-
95
- ```json
96
- {
97
- "schemaVersion": "openpond.datasetTaskAppend.v1",
98
- "operationId": "stable-source-event",
99
- "task": {
100
- "name": "Handle an expired API token",
101
- "input": { "observedError": "Token expired" }
102
- }
103
- }
104
- ```
105
-
106
- The server owns authorization, atomic append and revision history. Appending
107
- does not rewrite fixed Experiment Dataset versions or previously published
108
- releases. Full authoring still uses the revisioned Dataset workspace API.
73
+ When `id` is omitted the SDK generates one before dispatch. On uncertain delivery,
74
+ `DatasetTaskIngestionError.sourceId` (also `operationId`) retains it. Supply that
75
+ ID in a later retry. Prefer an explicit ID when cancellation or process exit could
76
+ prevent handling the error. An event never transmitted successfully cannot be
77
+ promised durable. `idempotencyKey` is accepted for existing callers; supplying a
78
+ conflicting `task.id` is rejected before dispatch.
79
+
80
+ Every task has `name` and structured `input`. Optional fields: `expectedOutput`,
81
+ `split`, `tags`, and `source` (`kind`, `eventId`, `label`, `occurredAt`). Default
82
+ split: `validation`; `train` alone grants no learning authority. Requests are
83
+ bounded to 128 KiB. The receipt retains workspace, Dataset, canonical task and
84
+ source identities, first-save `receivedAt`, revision, `state: "saved"` and
85
+ `trainingUseAuthorized: false`. Source occurrence time differs from upload time.
86
+ Existing immutable releases and Experiment inputs retain their own identities.
109
87
 
110
88
  ## Python
111
89
 
112
- The maintained `ponder-sdk` package exposes the same operation on `Client`
113
- and `AsyncClient`:
90
+ `ponder-sdk` uses the same configured destination and source ID with its native
91
+ owned connection pool:
114
92
 
115
93
  ```python
116
94
  from ponder_sdk import Client
117
95
 
118
- with Client(base_url=api_origin, api_key=api_key, team_id=team_id) as client:
119
- receipt = client.add_task(
120
- dataset_id,
121
- {"name": "Handle an expired API token", "input": {"error": "Token expired"}},
122
- idempotency_key=source_event_id,
123
- )
96
+ with Client(api_key=api_key, team_id=team_id,
97
+ dataset_id=dataset_id) as openpond:
98
+ receipt = openpond.add_task({
99
+ "id": source_event_id,
100
+ "name": "Expired token",
101
+ "input": {"error": "Token expired"},
102
+ })
103
+ # Alternate destination; uses the same pool:
104
+ # openpond.dataset(other_dataset_id).add_task(task)
124
105
  ```
125
106
 
126
- Use `async with AsyncClient(...)` and `await client.add_task(...)` for async
127
- applications. Both use the existing client connection pool and typed wire
128
- validation. Retain the caller's key/task across an unknown mutation outcome.
107
+ Sync calls block their calling thread. Async applications use
108
+ `async with AsyncClient(...)` and `await openpond.add_task(task)`. Both validate the
109
+ maintained wire schemas and never replay writes automatically. A `PonderError`
110
+ retains `operation_id` and `outcome_unknown`; cancellation propagates, so retain
111
+ your own source ID before awaiting. Closing the HTTP pool is resource cleanup,
112
+ not delivery flushing.
113
+
114
+ ## HTTP and React
115
+
116
+ The HTTP operation remains `POST /v1/dataset-workspaces/{datasetId}/tasks` with
117
+ Bearer auth and `X-OpenPond-Team-Id`. The public `task.id` maps to wire
118
+ `operationId`; it is excluded from `task` content:
119
+
120
+ ```json
121
+ {
122
+ "schemaVersion": "openpond.datasetTaskAppend.v1",
123
+ "operationId": "stable-source-event",
124
+ "task": { "name": "Expired token", "input": { "error": "expired" } }
125
+ }
126
+ ```
129
127
 
130
- ## OpenTelemetry
128
+ React calls your authenticated product backend. The backend selects an authorized
129
+ Dataset and awaits the configured client. Keep OpenPond secrets and destination
130
+ authority server-side; do not accept an arbitrary browser-supplied Dataset ID.
131
+ For named model calls and the optional Vercel integration see
132
+ [product integration](PRODUCT_INTEGRATION.md).
131
133
 
132
- OpenTelemetry is an optional source adapter, not this HTTP request format.
133
- Its span exporter can project explicitly selected spans into structured tasks
134
- using the same destination and receipts. It does not make this endpoint an
135
- OTLP receiver, automatically capture arbitrary logs, or authorize training.
134
+ OpenTelemetry is a separate optional source adapter, not this request format.
135
+ Project explicitly selected spans into structured tasks. This endpoint is not an
136
+ OTLP receiver and does not capture arbitrary logs or authorize training.
@@ -50,8 +50,8 @@ GET /v1/training/jobs?modelProjectId=&cursor=&limit=
50
50
  GET /v1/training/jobs/{jobId}
51
51
  POST /v1/training/jobs/{jobId}/cancel
52
52
  POST /v1/training/jobs/{jobId}/stop-after-group
53
- GET /v1/training/jobs/{jobId}/events
54
- GET /v1/training/jobs/{jobId}/logs
53
+ GET /v1/training/jobs/{jobId}/events?after=0&limit=50
54
+ GET /v1/training/jobs/{jobId}/logs?after=0&limit=50
55
55
  GET /v1/training/jobs/{jobId}/outputs
56
56
 
57
57
  PUT /v1/model-projects/{portableProjectId}
@@ -205,7 +205,7 @@ and an in-memory asset map without creating a training job or acquiring compute.
205
205
 
206
206
  The compiler verifies selected release identities and private verifier bytes,
207
207
  checks training/evaluation isolation, and rejects missing or unexpected Work
208
- assets. Callers retain responsibility for authorizing the inputs and staging the
208
+ assets. Callers retain responsibility for authorizing the inputs and preparing the
209
209
  result through the training artifact API before job admission. Filesystem cache
210
210
  materialization remains a Desktop concern.
211
211
 
@@ -328,3 +328,7 @@ It performs no authentication, network upload, tool execution, training, or mode
328
328
  activation. Callers must verify authentic durable hosted receipts before
329
329
  acknowledging delivery. Import the portable entry in browser code; the Node queue
330
330
  is a separate runtime capability.
331
+
332
+ ### Retained evidence pagination
333
+
334
+ Events and logs return at most 100 records per database-selected page (default 50), plus `nextOffset` or `null`. Use `training.eventsPage(jobId, { after, limit })` and `training.logsPage(...)` to obtain `{ items, nextOffset }`. The SDK validates the returned job, sequence window, count and continuation before exposing records. Offsets address the current ordered snapshot; lifecycle snapshots can change while a run is live. They are not an immutable append-only cursor. Existing `events()`/`logs()` convenience reads follow pages with an aggregate response-byte budget and a 100,000-record ceiling. MCP requests exactly one page.
@@ -9,8 +9,8 @@ the actual host/account before preparing work.
9
9
 
10
10
  ## Authentication and lifecycle
11
11
 
12
- Training and Model clients accept `baseUrl`, `headers` (including an async token
13
- supplier) and an injectable `fetch`. Use the host's normal Bearer credential and
12
+ Training and Model clients connect to OpenPond automatically. They accept
13
+ `headers` (including an async token supplier) and an injectable `fetch`. Use your API key as the Bearer credential and
14
14
  `X-OpenPond-Team-Id`; retain server authorization and owner checks. Learning,
15
15
  Dataset and taskset-run clients accept their existing `apiKey` and workspace
16
16
  scope. Never put credentials in URLs, request identities, fixtures or receipts.
@@ -204,8 +204,7 @@ the job controls and keep its identity.
204
204
  explicit `recordCandidateDecision` with its exact artifact reference and CAS.
205
205
  `cancel` reconciles the current job version before sending remote cancellation.
206
206
 
207
- The examples require `OPENPOND_API_URL`, `OPENPOND_API_KEY` and
208
- `OPENPOND_TEAM_ID` from the caller's normal configured account. They use only
207
+ The examples require `OPENPOND_API_KEY` and `OPENPOND_TEAM_ID` from the caller's normal configured account. They use only
209
208
  public SDK imports, bound each invocation to two minutes and write new receipt
210
209
  files exclusively with mode0600. They do not poll indefinitely or automatically
211
210
  retry an uncertain paid start. Keep the original receipt for future reconciliation.
@@ -495,9 +494,9 @@ of `neuron_steering` and `inspect_activations`. `draftSchema` describes the form
495
494
  not permission to write or execute.
496
495
 
497
496
  Each capability observation retains `validationLevel`: `null` when execution is
498
- unavailable, `source_validated` for an experimental staging runtime, or
497
+ unavailable, `source_validated` for an experimental runtime, or
499
498
  `gpu_qualified` after a retained exact-model/runtime GPU run. Source validation
500
- describes a runtime reviewed for an experimental staging trial; it is not
499
+ describes a runtime reviewed for an experimental trial; it is not
501
500
  evidence that training or inference has already succeeded. Read the runtime's retained evidence; neither level
502
501
  reserves compute, approves a charge or establishes model quality. Engram,
503
502
  Decision, AlphaEdit and neuron-training capabilities use the same distinction.
@@ -669,3 +668,9 @@ optimizer creation and exports a cumulative patch with parent, initial and
669
668
  final state hashes. A runtime must explicitly advertise this mode before
670
669
  admission; source packaging alone does not establish native qualification or
671
670
  old/new held-out retention.
671
+
672
+ ### Managed GRPO sampling support
673
+
674
+ Use `topP: 1` for managed GRPO. The current qualified trainer replays temperature and the retained required-tool grammar; it cannot replay an independent nucleus filter or separate JSON response grammar. Unsupported generation settings are rejected during preparation, before allocation. Structured Work output uses its supported required-tool path. Existing saved requests retain their explicit settings and are never silently rewritten.
675
+
676
+ The current managed runtime admits at least two optimizer iterations. A single iteration is not inherently invalid GRPO, but needs explicit support from the selected runtime before it can be prepared. Each iteration accumulates the entire trajectory group before stepping; `gradientAccumulationSteps` does not define separate optimizer windows for GRPO. SFT uses its own true batch accumulation and exact model/image limits. Held-out SFT evaluation does not select optimizer updates.
@@ -12,19 +12,20 @@ import {
12
12
  sealAdvancedRefinerEvaluationPin,
13
13
  sealAdvancedRefinerReviewReceipt,
14
14
  verifyAdvancedRefinerEvaluationPin
15
- } from "./chunk-6EZAGTZG.js";
16
- import "./chunk-3B5KSH3V.js";
17
- import "./chunk-H3367ISL.js";
18
- import "./chunk-QNOCM5JX.js";
19
- import "./chunk-626JLH4D.js";
15
+ } from "./chunk-X5AT253K.js";
16
+ import "./chunk-D26RJQU7.js";
17
+ import "./chunk-456F3BXD.js";
18
+ import "./chunk-JWEIAEQ6.js";
20
19
  import "./chunk-O6FKHAWN.js";
21
- import "./chunk-GS5HEE4M.js";
22
- import "./chunk-ZRTNR4U7.js";
23
- import "./chunk-JMFYNIYZ.js";
24
- import "./chunk-MVAEE5EI.js";
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";
25
25
  import "./chunk-CL3IOOVL.js";
26
26
  import "./chunk-B3ZHJ2KK.js";
27
27
  import "./chunk-H3JZ3P5T.js";
28
+ import "./chunk-QYWPNNP3.js";
28
29
  import "./chunk-YLJ4XMA6.js";
29
30
  export {
30
31
  AdvancedRefinerEvaluationAccountingSchema,