openpond-sdk 0.12.13 → 0.12.15

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 (301) hide show
  1. package/TRAINING_WORKFLOWS.md +497 -4
  2. package/dist/advanced-refiner-evaluations.js +7 -7
  3. package/dist/candidate-evaluations.js +6 -6
  4. package/dist/{chunk-TLSP5JKG.js → chunk-3BYFS4RO.js} +2 -2
  5. package/dist/{chunk-XRBM6PBD.js → chunk-3MDNVNBM.js} +5 -5
  6. package/dist/{chunk-CNREFTAV.js → chunk-3VUF5H3B.js} +2 -2
  7. package/dist/{chunk-LHHHJIDR.js → chunk-626JLH4D.js} +2 -2
  8. package/dist/{chunk-Q4TKI2MV.js → chunk-774OWTCD.js} +63 -80
  9. package/dist/chunk-774OWTCD.js.map +1 -0
  10. package/dist/{chunk-HAQPGTQ4.js → chunk-7F43U2NC.js} +2 -2
  11. package/dist/{chunk-ORYA2G7S.js → chunk-7G47YXQT.js} +3 -3
  12. package/dist/{chunk-XMVSQIK4.js → chunk-AG6UJ3DI.js} +2 -2
  13. package/dist/chunk-EBB36D5X.js +866 -0
  14. package/dist/chunk-EBB36D5X.js.map +1 -0
  15. package/dist/{chunk-JBYFD3QS.js → chunk-GBDBKGXW.js} +3 -3
  16. package/dist/{chunk-GHPCQXG5.js → chunk-GCUWJUUM.js} +2 -2
  17. package/dist/{chunk-C4W2MEFP.js → chunk-GS5HEE4M.js} +2 -2
  18. package/dist/{chunk-ATVQQCYN.js → chunk-GWXJSBWR.js} +2 -2
  19. package/dist/{chunk-RLW4Y5ZV.js → chunk-JMFYNIYZ.js} +4 -3
  20. package/dist/chunk-JMFYNIYZ.js.map +1 -0
  21. package/dist/{chunk-UOV2LEXS.js → chunk-MVAEE5EI.js} +60 -3
  22. package/dist/chunk-MVAEE5EI.js.map +1 -0
  23. package/dist/{chunk-KOJC3TH4.js → chunk-OBI2MQYU.js} +6 -6
  24. package/dist/chunk-PMVSO23F.js +65 -0
  25. package/dist/chunk-PMVSO23F.js.map +1 -0
  26. package/dist/{chunk-JDQVAG3R.js → chunk-Q4RGCEOI.js} +3 -3
  27. package/dist/{chunk-YIGFQWZV.js → chunk-QIGMNB6M.js} +3 -3
  28. package/dist/{chunk-O3NOGKMT.js → chunk-QNOCM5JX.js} +2 -2
  29. package/dist/{chunk-2LVR24GU.js → chunk-QOX57Y27.js} +6 -6
  30. package/dist/chunk-QTNYXOJW.js +27 -0
  31. package/dist/chunk-QTNYXOJW.js.map +1 -0
  32. package/dist/{chunk-UWY5PUHR.js → chunk-RN5MK7NH.js} +2 -2
  33. package/dist/{chunk-47I6LT4X.js → chunk-RT7SQHO4.js} +271 -7
  34. package/dist/chunk-RT7SQHO4.js.map +1 -0
  35. package/dist/chunk-UVQENVTW.js +85 -0
  36. package/dist/chunk-UVQENVTW.js.map +1 -0
  37. package/dist/{chunk-7BYLH47N.js → chunk-VPK3SM45.js} +15 -3
  38. package/dist/{chunk-7BYLH47N.js.map → chunk-VPK3SM45.js.map} +1 -1
  39. package/dist/{chunk-RN5G3DQN.js → chunk-WM3U4RPZ.js} +6 -6
  40. package/dist/{chunk-IFBCLRBM.js → chunk-ZQ6QTYRE.js} +2 -2
  41. package/dist/{chunk-IFBCLRBM.js.map → chunk-ZQ6QTYRE.js.map} +1 -1
  42. package/dist/{chunk-K54BDIKL.js → chunk-ZQFROKKS.js} +3 -3
  43. package/dist/{chunk-ZYDDHHZZ.js → chunk-ZRTNR4U7.js} +3 -3
  44. package/dist/connected-evidence.js +9 -17
  45. package/dist/dataset-workspaces.js +12 -17
  46. package/dist/dataset-workspaces.js.map +1 -1
  47. package/dist/errors.js +3 -3
  48. package/dist/experiment-evaluation-schedules.js +18 -21
  49. package/dist/experiment-improvements.js +9 -8
  50. package/dist/experiments.js +17 -20
  51. package/dist/index.js +25 -27
  52. package/dist/index.js.map +1 -1
  53. package/dist/model-projects.js +1 -1
  54. package/dist/model-starter-attempts.js +2 -2
  55. package/dist/model-starter-catalog.js +4 -12
  56. package/dist/model-starter-catalog.js.map +1 -1
  57. package/dist/model-starters.js +4 -12
  58. package/dist/model-taskset-runs.js +3 -3
  59. package/dist/post-training.js +6 -6
  60. package/dist/taskset-drafts.js +6 -15
  61. package/dist/taskset-drafts.js.map +1 -1
  62. package/dist/taskset-packages.js +28 -18
  63. package/dist/tool-learning-local-store.js +2 -1
  64. package/dist/tool-learning-local-store.js.map +1 -1
  65. package/dist/training-bundle.js +33 -32
  66. package/dist/training-bundle.js.map +1 -1
  67. package/dist/training.js +8483 -49
  68. package/dist/training.js.map +1 -1
  69. package/dist/types/packages/cloud/src/sandbox/types/billing.d.ts +87 -6
  70. package/dist/types/packages/cloud/src/sandbox/types/billing.d.ts.map +1 -1
  71. package/dist/types/packages/cloud/src/sandbox/types/io.d.ts +3 -0
  72. package/dist/types/packages/cloud/src/sandbox/types/io.d.ts.map +1 -1
  73. package/dist/types/packages/sdk/src/activation-experiment-draft.d.ts +70 -0
  74. package/dist/types/packages/sdk/src/activation-experiment-draft.d.ts.map +1 -0
  75. package/dist/types/packages/sdk/src/activation-form-compiler.d.ts +25 -0
  76. package/dist/types/packages/sdk/src/activation-form-compiler.d.ts.map +1 -0
  77. package/dist/types/packages/sdk/src/activation-reference.d.ts +347 -0
  78. package/dist/types/packages/sdk/src/activation-reference.d.ts.map +1 -0
  79. package/dist/types/packages/sdk/src/activation-result-comparison.d.ts +185 -0
  80. package/dist/types/packages/sdk/src/activation-result-comparison.d.ts.map +1 -0
  81. package/dist/types/packages/sdk/src/alphaedit-artifact.d.ts +872 -0
  82. package/dist/types/packages/sdk/src/alphaedit-artifact.d.ts.map +1 -0
  83. package/dist/types/packages/sdk/src/alphaedit-experiment-draft.d.ts +123 -0
  84. package/dist/types/packages/sdk/src/alphaedit-experiment-draft.d.ts.map +1 -0
  85. package/dist/types/packages/sdk/src/alphaedit-model-serving.d.ts +3218 -0
  86. package/dist/types/packages/sdk/src/alphaedit-model-serving.d.ts.map +1 -0
  87. package/dist/types/packages/sdk/src/alphaedit.d.ts +258 -0
  88. package/dist/types/packages/sdk/src/alphaedit.d.ts.map +1 -0
  89. package/dist/types/packages/sdk/src/dataset-training-review-contracts.d.ts +181 -0
  90. package/dist/types/packages/sdk/src/dataset-training-review-contracts.d.ts.map +1 -0
  91. package/dist/types/packages/sdk/src/dataset-training-review-files.d.ts +17 -0
  92. package/dist/types/packages/sdk/src/dataset-training-review-files.d.ts.map +1 -0
  93. package/dist/types/packages/sdk/src/dataset-training-review-preparation.d.ts +541 -0
  94. package/dist/types/packages/sdk/src/dataset-training-review-preparation.d.ts.map +1 -0
  95. package/dist/types/packages/sdk/src/dataset-training-review-source.d.ts +41 -0
  96. package/dist/types/packages/sdk/src/dataset-training-review-source.d.ts.map +1 -0
  97. package/dist/types/packages/sdk/src/dataset-training-review.d.ts +79 -0
  98. package/dist/types/packages/sdk/src/dataset-training-review.d.ts.map +1 -0
  99. package/dist/types/packages/sdk/src/decision-experiment-authoring.d.ts +11 -0
  100. package/dist/types/packages/sdk/src/decision-experiment-authoring.d.ts.map +1 -0
  101. package/dist/types/packages/sdk/src/decision-experiment-draft.d.ts +150 -0
  102. package/dist/types/packages/sdk/src/decision-experiment-draft.d.ts.map +1 -0
  103. package/dist/types/packages/sdk/src/decision-model-artifact.d.ts +541 -0
  104. package/dist/types/packages/sdk/src/decision-model-artifact.d.ts.map +1 -0
  105. package/dist/types/packages/sdk/src/decision-model-data.d.ts +588 -0
  106. package/dist/types/packages/sdk/src/decision-model-data.d.ts.map +1 -0
  107. package/dist/types/packages/sdk/src/decision-model-scoring.d.ts +1587 -0
  108. package/dist/types/packages/sdk/src/decision-model-scoring.d.ts.map +1 -0
  109. package/dist/types/packages/sdk/src/decision-model-serving.d.ts +5328 -0
  110. package/dist/types/packages/sdk/src/decision-model-serving.d.ts.map +1 -0
  111. package/dist/types/packages/sdk/src/decision-model-training.d.ts +871 -0
  112. package/dist/types/packages/sdk/src/decision-model-training.d.ts.map +1 -0
  113. package/dist/types/packages/sdk/src/decision-model-version.d.ts +2971 -0
  114. package/dist/types/packages/sdk/src/decision-model-version.d.ts.map +1 -0
  115. package/dist/types/packages/sdk/src/decision-model.d.ts +241 -0
  116. package/dist/types/packages/sdk/src/decision-model.d.ts.map +1 -0
  117. package/dist/types/packages/sdk/src/engram-adapter.d.ts +788 -0
  118. package/dist/types/packages/sdk/src/engram-adapter.d.ts.map +1 -0
  119. package/dist/types/packages/sdk/src/engram-experiment-authoring.d.ts +14 -0
  120. package/dist/types/packages/sdk/src/engram-experiment-authoring.d.ts.map +1 -0
  121. package/dist/types/packages/sdk/src/engram-experiment-draft.d.ts +92 -0
  122. package/dist/types/packages/sdk/src/engram-experiment-draft.d.ts.map +1 -0
  123. package/dist/types/packages/sdk/src/engram-inference.d.ts +180 -0
  124. package/dist/types/packages/sdk/src/engram-inference.d.ts.map +1 -0
  125. package/dist/types/packages/sdk/src/engram-model-serving.d.ts +2183 -0
  126. package/dist/types/packages/sdk/src/engram-model-serving.d.ts.map +1 -0
  127. package/dist/types/packages/sdk/src/engram-model-version.d.ts +1335 -0
  128. package/dist/types/packages/sdk/src/engram-model-version.d.ts.map +1 -0
  129. package/dist/types/packages/sdk/src/evaluation-experiment-draft.d.ts +1009 -0
  130. package/dist/types/packages/sdk/src/evaluation-experiment-draft.d.ts.map +1 -0
  131. package/dist/types/packages/sdk/src/experiment-client.d.ts +686 -686
  132. package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts +11638 -0
  133. package/dist/types/packages/sdk/src/experiment-draft-storage.d.ts.map +1 -0
  134. package/dist/types/packages/sdk/src/experiment-result-reference.d.ts +288 -0
  135. package/dist/types/packages/sdk/src/experiment-result-reference.d.ts.map +1 -0
  136. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +7 -7
  137. package/dist/types/packages/sdk/src/experiment-starting-model.d.ts +911 -0
  138. package/dist/types/packages/sdk/src/experiment-starting-model.d.ts.map +1 -0
  139. package/dist/types/packages/sdk/src/hosted-evaluation-experiment-draft.d.ts +693 -0
  140. package/dist/types/packages/sdk/src/hosted-evaluation-experiment-draft.d.ts.map +1 -0
  141. package/dist/types/packages/sdk/src/managed-alphaedit-executions.d.ts +3152 -0
  142. package/dist/types/packages/sdk/src/managed-alphaedit-executions.d.ts.map +1 -0
  143. package/dist/types/packages/sdk/src/managed-compute-price.d.ts +50 -0
  144. package/dist/types/packages/sdk/src/managed-compute-price.d.ts.map +1 -0
  145. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts +6755 -0
  146. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts.map +1 -0
  147. package/dist/types/packages/sdk/src/managed-engram-executions.d.ts +2774 -0
  148. package/dist/types/packages/sdk/src/managed-engram-executions.d.ts.map +1 -0
  149. package/dist/types/packages/sdk/src/managed-modification-compilation.d.ts +523 -0
  150. package/dist/types/packages/sdk/src/managed-modification-compilation.d.ts.map +1 -0
  151. package/dist/types/packages/sdk/src/managed-modification-executions.d.ts +1470 -0
  152. package/dist/types/packages/sdk/src/managed-modification-executions.d.ts.map +1 -0
  153. package/dist/types/packages/sdk/src/managed-neuron-training-executions.d.ts +3447 -0
  154. package/dist/types/packages/sdk/src/managed-neuron-training-executions.d.ts.map +1 -0
  155. package/dist/types/packages/sdk/src/managed-serving-usage.d.ts +228 -0
  156. package/dist/types/packages/sdk/src/managed-serving-usage.d.ts.map +1 -0
  157. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +26 -26
  158. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  159. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts +11 -0
  160. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts.map +1 -1
  161. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts +10 -0
  162. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts.map +1 -1
  163. package/dist/types/packages/sdk/src/model-batch-review.d.ts +21 -0
  164. package/dist/types/packages/sdk/src/model-batch-review.d.ts.map +1 -1
  165. package/dist/types/packages/sdk/src/model-learning-policy.d.ts +9 -0
  166. package/dist/types/packages/sdk/src/model-learning-policy.d.ts.map +1 -1
  167. package/dist/types/packages/sdk/src/model-modification-capabilities.d.ts +323 -0
  168. package/dist/types/packages/sdk/src/model-modification-capabilities.d.ts.map +1 -0
  169. package/dist/types/packages/sdk/src/model-serving-pool.d.ts +28 -0
  170. package/dist/types/packages/sdk/src/model-serving-pool.d.ts.map +1 -0
  171. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts +22 -0
  172. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts.map +1 -1
  173. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +216 -216
  174. package/dist/types/packages/sdk/src/modification-recordings.d.ts +1303 -0
  175. package/dist/types/packages/sdk/src/modification-recordings.d.ts.map +1 -0
  176. package/dist/types/packages/sdk/src/neuron-calibration-records.d.ts +816 -0
  177. package/dist/types/packages/sdk/src/neuron-calibration-records.d.ts.map +1 -0
  178. package/dist/types/packages/sdk/src/neuron-residual-calibration.d.ts +189 -0
  179. package/dist/types/packages/sdk/src/neuron-residual-calibration.d.ts.map +1 -0
  180. package/dist/types/packages/sdk/src/neuron-steering.d.ts +260 -0
  181. package/dist/types/packages/sdk/src/neuron-steering.d.ts.map +1 -0
  182. package/dist/types/packages/sdk/src/neuron-training-artifact.d.ts +517 -0
  183. package/dist/types/packages/sdk/src/neuron-training-artifact.d.ts.map +1 -0
  184. package/dist/types/packages/sdk/src/neuron-training-experiment-draft.d.ts +172 -0
  185. package/dist/types/packages/sdk/src/neuron-training-experiment-draft.d.ts.map +1 -0
  186. package/dist/types/packages/sdk/src/neuron-training-model-serving.d.ts +3502 -0
  187. package/dist/types/packages/sdk/src/neuron-training-model-serving.d.ts.map +1 -0
  188. package/dist/types/packages/sdk/src/neuron-training-result.d.ts +590 -0
  189. package/dist/types/packages/sdk/src/neuron-training-result.d.ts.map +1 -0
  190. package/dist/types/packages/sdk/src/neuron-training.d.ts +260 -0
  191. package/dist/types/packages/sdk/src/neuron-training.d.ts.map +1 -0
  192. package/dist/types/packages/sdk/src/post-training.d.ts +21 -0
  193. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
  194. package/dist/types/packages/sdk/src/profile-external-dataset-package.d.ts +10 -0
  195. package/dist/types/packages/sdk/src/profile-external-dataset-package.d.ts.map +1 -1
  196. package/dist/types/packages/sdk/src/steering-experiment-authoring.d.ts +15 -0
  197. package/dist/types/packages/sdk/src/steering-experiment-authoring.d.ts.map +1 -0
  198. package/dist/types/packages/sdk/src/steering-experiment-source-verification.d.ts +97 -0
  199. package/dist/types/packages/sdk/src/steering-experiment-source-verification.d.ts.map +1 -0
  200. package/dist/types/packages/sdk/src/steering-experiment-source.d.ts +29 -0
  201. package/dist/types/packages/sdk/src/steering-experiment-source.d.ts.map +1 -0
  202. package/dist/types/packages/sdk/src/steering-inference.d.ts +224 -0
  203. package/dist/types/packages/sdk/src/steering-inference.d.ts.map +1 -0
  204. package/dist/types/packages/sdk/src/steering-model-selection.d.ts +15 -0
  205. package/dist/types/packages/sdk/src/steering-model-selection.d.ts.map +1 -0
  206. package/dist/types/packages/sdk/src/steering-model-serving.d.ts +8759 -0
  207. package/dist/types/packages/sdk/src/steering-model-serving.d.ts.map +1 -0
  208. package/dist/types/packages/sdk/src/steering-profile-publication.d.ts +7892 -0
  209. package/dist/types/packages/sdk/src/steering-profile-publication.d.ts.map +1 -0
  210. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +20 -0
  211. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -1
  212. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +40 -0
  213. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  214. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts +20 -0
  215. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts.map +1 -1
  216. package/dist/types/packages/sdk/src/taskset-package-learning.d.ts +20 -0
  217. package/dist/types/packages/sdk/src/taskset-package-learning.d.ts.map +1 -1
  218. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +10 -0
  219. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -1
  220. package/dist/types/packages/sdk/src/taskset-packages.d.ts +4 -0
  221. package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
  222. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts +2 -0
  223. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts.map +1 -1
  224. package/dist/types/packages/sdk/src/training-compute-selection.d.ts +186 -1
  225. package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
  226. package/dist/types/packages/sdk/src/training-estimate-workload.d.ts +185 -0
  227. package/dist/types/packages/sdk/src/training-estimate-workload.d.ts.map +1 -0
  228. package/dist/types/packages/sdk/src/training-estimates.d.ts +185 -0
  229. package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -1
  230. package/dist/types/packages/sdk/src/training-executions.d.ts +275 -0
  231. package/dist/types/packages/sdk/src/training-executions.d.ts.map +1 -0
  232. package/dist/types/packages/sdk/src/training-experiment-setup.d.ts +5957 -0
  233. package/dist/types/packages/sdk/src/training-experiment-setup.d.ts.map +1 -0
  234. package/dist/types/packages/sdk/src/training-funding.d.ts +153 -0
  235. package/dist/types/packages/sdk/src/training-funding.d.ts.map +1 -0
  236. package/dist/types/packages/sdk/src/training-hardware-catalog.d.ts +155 -0
  237. package/dist/types/packages/sdk/src/training-hardware-catalog.d.ts.map +1 -0
  238. package/dist/types/packages/sdk/src/training-job-contracts.d.ts +1535 -0
  239. package/dist/types/packages/sdk/src/training-job-contracts.d.ts.map +1 -0
  240. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
  241. package/dist/types/packages/sdk/src/training-model-save.d.ts +2466 -0
  242. package/dist/types/packages/sdk/src/training-model-save.d.ts.map +1 -0
  243. package/dist/types/packages/sdk/src/training-model-serving-control.d.ts +397 -0
  244. package/dist/types/packages/sdk/src/training-model-serving-control.d.ts.map +1 -0
  245. package/dist/types/packages/sdk/src/training-model-serving.d.ts +2662 -0
  246. package/dist/types/packages/sdk/src/training-model-serving.d.ts.map +1 -0
  247. package/dist/types/packages/sdk/src/training-preparations.d.ts +1001 -0
  248. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  249. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +1 -1
  250. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
  251. package/dist/types/packages/sdk/src/training-result.d.ts +4577 -0
  252. package/dist/types/packages/sdk/src/training-result.d.ts.map +1 -0
  253. package/dist/types/packages/sdk/src/training-usage-funding.d.ts +273 -0
  254. package/dist/types/packages/sdk/src/training-usage-funding.d.ts.map +1 -0
  255. package/dist/types/packages/sdk/src/training-usage-status.d.ts +27 -0
  256. package/dist/types/packages/sdk/src/training-usage-status.d.ts.map +1 -0
  257. package/dist/types/packages/sdk/src/training.d.ts +18309 -3682
  258. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  259. package/dist/types/packages/sdk/src/weight-experiment-authoring.d.ts +23 -0
  260. package/dist/types/packages/sdk/src/weight-experiment-authoring.d.ts.map +1 -0
  261. package/dist/types/packages/sdk/src/weight-inference.d.ts +155 -0
  262. package/dist/types/packages/sdk/src/weight-inference.d.ts.map +1 -0
  263. package/dist/types/packages/sdk/src/weight-model-versions.d.ts +4578 -0
  264. package/dist/types/packages/sdk/src/weight-model-versions.d.ts.map +1 -0
  265. package/fixtures/python-foundation/activation-reference-workflow.json +6403 -0
  266. package/fixtures/python-foundation/dataset-training-review-http-workflow.json +62 -0
  267. package/fixtures/python-foundation/operation-matrix.json +1410 -220
  268. package/fixtures/python-foundation/schemas.json +59491 -25928
  269. package/fixtures/python-foundation/training-estimate-http-workflow.json +100 -0
  270. package/fixtures/python-foundation/training-funding-http-workflow.json +61 -0
  271. package/fixtures/python-foundation/training-model-save-http-workflow.json +302 -0
  272. package/fixtures/python-foundation/training-model-serving-control-http-workflow.json +1633 -0
  273. package/fixtures/python-foundation/training-model-serving-http-workflow.json +1181 -0
  274. package/fixtures/python-foundation/training-result-http-workflow.json +230 -0
  275. package/package.json +3 -3
  276. package/dist/chunk-47I6LT4X.js.map +0 -1
  277. package/dist/chunk-GJRXJL6G.js +0 -1528
  278. package/dist/chunk-GJRXJL6G.js.map +0 -1
  279. package/dist/chunk-Q4TKI2MV.js.map +0 -1
  280. package/dist/chunk-RLW4Y5ZV.js.map +0 -1
  281. package/dist/chunk-UOV2LEXS.js.map +0 -1
  282. /package/dist/{chunk-TLSP5JKG.js.map → chunk-3BYFS4RO.js.map} +0 -0
  283. /package/dist/{chunk-XRBM6PBD.js.map → chunk-3MDNVNBM.js.map} +0 -0
  284. /package/dist/{chunk-CNREFTAV.js.map → chunk-3VUF5H3B.js.map} +0 -0
  285. /package/dist/{chunk-LHHHJIDR.js.map → chunk-626JLH4D.js.map} +0 -0
  286. /package/dist/{chunk-HAQPGTQ4.js.map → chunk-7F43U2NC.js.map} +0 -0
  287. /package/dist/{chunk-ORYA2G7S.js.map → chunk-7G47YXQT.js.map} +0 -0
  288. /package/dist/{chunk-XMVSQIK4.js.map → chunk-AG6UJ3DI.js.map} +0 -0
  289. /package/dist/{chunk-JBYFD3QS.js.map → chunk-GBDBKGXW.js.map} +0 -0
  290. /package/dist/{chunk-GHPCQXG5.js.map → chunk-GCUWJUUM.js.map} +0 -0
  291. /package/dist/{chunk-C4W2MEFP.js.map → chunk-GS5HEE4M.js.map} +0 -0
  292. /package/dist/{chunk-ATVQQCYN.js.map → chunk-GWXJSBWR.js.map} +0 -0
  293. /package/dist/{chunk-KOJC3TH4.js.map → chunk-OBI2MQYU.js.map} +0 -0
  294. /package/dist/{chunk-JDQVAG3R.js.map → chunk-Q4RGCEOI.js.map} +0 -0
  295. /package/dist/{chunk-YIGFQWZV.js.map → chunk-QIGMNB6M.js.map} +0 -0
  296. /package/dist/{chunk-O3NOGKMT.js.map → chunk-QNOCM5JX.js.map} +0 -0
  297. /package/dist/{chunk-2LVR24GU.js.map → chunk-QOX57Y27.js.map} +0 -0
  298. /package/dist/{chunk-UWY5PUHR.js.map → chunk-RN5MK7NH.js.map} +0 -0
  299. /package/dist/{chunk-RN5G3DQN.js.map → chunk-WM3U4RPZ.js.map} +0 -0
  300. /package/dist/{chunk-K54BDIKL.js.map → chunk-ZQFROKKS.js.map} +0 -0
  301. /package/dist/{chunk-ZYDDHHZZ.js.map → chunk-ZRTNR4U7.js.map} +0 -0
@@ -1,1528 +0,0 @@
1
- import {
2
- createTrainingHardwareClient
3
- } from "./chunk-EZME7DV4.js";
4
- import {
5
- createTrainingRequest
6
- } from "./chunk-GX6KMHW2.js";
7
- import {
8
- TrainingHandoffOriginSchema,
9
- createPostTrainingClient
10
- } from "./chunk-7BYLH47N.js";
11
- import {
12
- validateHarnessPolicySourcePackage,
13
- validateHarnessSourcePackage
14
- } from "./chunk-Q4TKI2MV.js";
15
- import {
16
- ModelProjectBaseModelSchema,
17
- ModelProjectImmutableRefSchema,
18
- ModelProjectRecipeDocumentSchema,
19
- ModelProjectVersionedRefSchema,
20
- TrainingEstimateReviewSchema,
21
- TrainingGpuCatalogSchema,
22
- TrainingGpuSelectionSchema
23
- } from "./chunk-UOV2LEXS.js";
24
- import {
25
- OpenPondProtocolError,
26
- TRAINING_API_RESPONSE_MAX_BYTES,
27
- TRAINING_INPUT_ARTIFACT_MAX_BYTES,
28
- TRAINING_JOB_SUBMISSION_MAX_BYTES,
29
- assertCanonicalPayloadSize,
30
- canonicalSha256
31
- } from "./chunk-B3ZHJ2KK.js";
32
- import {
33
- ImmutableReleaseRefSchema
34
- } from "./chunk-H3JZ3P5T.js";
35
-
36
- // src/training-supervised.ts
37
- import { z } from "zod";
38
- var Id = z.string().trim().min(1).max(240);
39
- var Hash = z.string().trim().min(8).max(256);
40
- var SftRecipeSchema = z.object({
41
- schemaVersion: z.literal("openpond.sftRecipe.v1"),
42
- method: z.literal("sft"),
43
- parameterization: z.literal("lora"),
44
- baseModel: z.object({
45
- id: Id,
46
- revision: z.string().trim().min(1).max(256),
47
- tokenizerRevision: z.string().trim().min(1).max(256),
48
- chatTemplateHash: Hash
49
- }),
50
- dataset: z.object({
51
- trainSplit: z.literal("train"),
52
- validationSplit: z.enum(["validation", "frozen_eval"]),
53
- completionOnly: z.boolean(),
54
- maxSequenceLength: z.number().int().positive().max(32768),
55
- maxExamples: z.number().int().positive().max(1e5).default(1e3),
56
- selectionStrategy: z.literal("stable_hash_top_n").default("stable_hash_top_n"),
57
- selectionSeed: z.number().int().default(17)
58
- }),
59
- lora: z.object({
60
- rank: z.number().int().positive().max(256),
61
- alpha: z.number().positive().max(1024),
62
- dropout: z.number().min(0).max(1),
63
- targetModules: z.array(Id).min(1).max(100)
64
- }),
65
- optimizer: z.object({
66
- learningRate: z.number().positive(),
67
- epochs: z.number().positive().max(100),
68
- maxSteps: z.number().int().positive().max(1e6),
69
- batchSize: z.number().int().positive().max(1e4),
70
- gradientAccumulationSteps: z.number().int().positive().max(1e4),
71
- seed: z.number().int()
72
- }),
73
- resourceLimits: z.object({
74
- cpuThreads: z.number().int().positive().max(256),
75
- memoryBytes: z.number().int().positive(),
76
- wallTimeMs: z.number().int().positive()
77
- })
78
- });
79
- var ManagedSftRecipeSchema = SftRecipeSchema.safeExtend({
80
- dataset: SftRecipeSchema.shape.dataset.safeExtend({
81
- completionOnly: z.literal(true),
82
- maxSequenceLength: z.number().int().min(2).max(8192),
83
- maxExamples: z.number().int().min(1).max(1e3).default(1e3)
84
- }),
85
- lora: SftRecipeSchema.shape.lora.safeExtend({
86
- rank: z.number().int().min(1).max(64),
87
- dropout: z.number().min(0).lt(1),
88
- targetModules: z.array(z.enum(["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"])).min(1).max(7)
89
- }),
90
- optimizer: SftRecipeSchema.shape.optimizer.safeExtend({
91
- learningRate: z.number().positive().max(1e-3),
92
- epochs: z.number().positive().max(10),
93
- maxSteps: z.number().int().min(1).max(128),
94
- batchSize: z.number().int().min(1).max(32),
95
- gradientAccumulationSteps: z.number().int().min(1).max(32),
96
- seed: z.number().int().min(-(2 ** 31)).max(2 ** 31 - 1)
97
- }),
98
- resourceLimits: SftRecipeSchema.shape.resourceLimits.safeExtend({
99
- wallTimeMs: z.number().int().min(1e3).max(216e5)
100
- })
101
- }).superRefine((recipe, context) => {
102
- if (recipe.optimizer.batchSize * recipe.optimizer.gradientAccumulationSteps > 32)
103
- context.addIssue({
104
- code: "custom",
105
- path: ["optimizer"],
106
- message: "Managed SFT supports at most 32 accumulated examples."
107
- });
108
- if (new Set(recipe.lora.targetModules).size !== recipe.lora.targetModules.length)
109
- context.addIssue({
110
- code: "custom",
111
- path: ["lora", "targetModules"],
112
- message: "Adapter target modules must be unique."
113
- });
114
- });
115
-
116
- // src/training-acceptance.ts
117
- import { z as z2 } from "zod";
118
- import { assertAcceptanceGroupSnapshot, AcceptanceGroupSnapshotSchema } from "@openpond/evals/learning";
119
- var Id2 = z2.string().trim().min(1).max(240);
120
- var TrainingAcceptanceGroupReferenceSchema = ModelProjectImmutableRefSchema.extend({ revision: z2.number().int().positive() }).strict();
121
- var TrainingAcceptanceGroupSummarySchema = TrainingAcceptanceGroupReferenceSchema.extend({
122
- teamId: Id2,
123
- jobId: Id2,
124
- plan: ModelProjectImmutableRefSchema,
125
- baseline: ModelProjectImmutableRefSchema,
126
- candidate: ModelProjectImmutableRefSchema,
127
- state: AcceptanceGroupSnapshotSchema.shape.state,
128
- updatedAt: z2.string().datetime()
129
- }).strict();
130
- var TrainingAcceptanceGroupPageSchema = z2.object({
131
- schemaVersion: z2.literal("openpond.trainingAcceptanceGroupPage.v1"),
132
- teamId: Id2,
133
- jobId: Id2,
134
- groups: z2.array(TrainingAcceptanceGroupSummarySchema).max(100),
135
- nextCursor: Id2.nullable()
136
- }).strict();
137
- var TrainingAcceptanceGroupQuerySchema = z2.object({
138
- cursor: Id2.optional(),
139
- limit: z2.number().int().min(1).max(100).default(25)
140
- }).strict();
141
- function createTrainingAcceptanceClient(request) {
142
- const route = (target) => {
143
- Id2.parse(target.teamId);
144
- return `/v1/training/jobs/${encodeURIComponent(Id2.parse(target.jobId))}/acceptance-groups`;
145
- };
146
- return {
147
- async acceptanceGroups(target, input = {}) {
148
- const query = TrainingAcceptanceGroupQuerySchema.parse(input);
149
- const params = new URLSearchParams({ limit: String(query.limit) });
150
- if (query.cursor) params.set("cursor", query.cursor);
151
- const page = TrainingAcceptanceGroupPageSchema.parse(await request(`${route(target)}?${params}`));
152
- if (page.teamId !== target.teamId || page.jobId !== target.jobId || page.groups.length > query.limit || page.groups.some((group) => group.teamId !== target.teamId || group.jobId !== target.jobId || query.cursor && group.id <= query.cursor) || new Set(page.groups.map((group) => group.id)).size !== page.groups.length || page.nextCursor !== null && page.nextCursor !== page.groups.at(-1)?.id)
153
- throw new OpenPondProtocolError("acceptance_group_scope_mismatch", "Acceptance groups do not match the requested workspace, job or cursor.");
154
- return page;
155
- },
156
- async acceptanceGroup(target, groupId, expected) {
157
- const reference = expected ? TrainingAcceptanceGroupReferenceSchema.parse({ id: expected.id, revision: expected.revision, contentHash: expected.contentHash }) : null;
158
- if (reference && reference.id !== groupId) throw new OpenPondProtocolError("acceptance_group_identity_mismatch", "The retained group reference differs from the requested group.");
159
- const suffix = reference ? `?revision=${reference.revision}` : "";
160
- const snapshot = assertAcceptanceGroupSnapshot(await request(`${route(target)}/${encodeURIComponent(Id2.parse(groupId))}${suffix}`));
161
- if (snapshot.manifest.teamId !== target.teamId || snapshot.manifest.trainingJob.id !== target.jobId || snapshot.manifest.id !== groupId || reference && (snapshot.revision !== reference.revision || snapshot.contentHash !== reference.contentHash))
162
- throw new OpenPondProtocolError("acceptance_group_identity_mismatch", "Acceptance evidence does not match the requested workspace, job or retained revision.");
163
- return snapshot;
164
- }
165
- };
166
- }
167
-
168
- // src/training.ts
169
- import { z as z13 } from "zod";
170
-
171
- // src/training-recovery.ts
172
- import { z as z3 } from "zod";
173
- var id = z3.string().trim().min(1).max(191);
174
- var hash = z3.string().regex(/^[a-f0-9]{64}$/);
175
- var ApprovalBodySchema = z3.object({
176
- schemaVersion: z3.literal("openpond.checkpointRecoveryResourceApproval.v1"),
177
- ownerUserId: id,
178
- teamId: id,
179
- sourceJobId: id,
180
- sourceJobVersion: z3.number().int().positive(),
181
- sourceInputManifestSha256: hash,
182
- checkpointId: id,
183
- adapterSha256: hash,
184
- resumeSha256: hash,
185
- idempotencyKey: z3.string().trim().min(16).max(191),
186
- approvedAt: z3.iso.datetime({ offset: true }),
187
- maximumSpendUsd: z3.number().positive().finite().max(30).refine(
188
- (value) => Number(value.toFixed(6)) === value,
189
- "Recovery spend must use whole microdollars"
190
- ),
191
- maximumGpuSeconds: z3.number().int().positive().max(21600),
192
- maximumWallSeconds: z3.number().int().positive().max(21600)
193
- }).strict();
194
- var TrainingCheckpointRecoveryResourceApprovalSchema = ApprovalBodySchema.extend({
195
- approvalHash: hash
196
- }).strict().superRefine((value, context) => {
197
- if (value.maximumGpuSeconds > value.maximumWallSeconds)
198
- context.addIssue({
199
- code: "custom",
200
- path: ["maximumGpuSeconds"],
201
- message: "Recovery GPU duration exceeds its wall"
202
- });
203
- });
204
- async function createTrainingCheckpointRecoveryResourceApproval(input) {
205
- const body = ApprovalBodySchema.parse(input);
206
- return TrainingCheckpointRecoveryResourceApprovalSchema.parse({
207
- ...body,
208
- approvalHash: await canonicalSha256(body)
209
- });
210
- }
211
- var TrainingCheckpointRecoveryRequestSchema = z3.object({
212
- resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
213
- mode: z3.literal("evaluation_only").optional(),
214
- evaluationGpuType: z3.enum(["NVIDIA A100 80GB PCIe", "NVIDIA A100-SXM4-80GB", "NVIDIA H100 80GB HBM3"]).optional(),
215
- expectedVersion: z3.number().int().positive(),
216
- checkpointId: id,
217
- idempotencyKey: z3.string().trim().min(16).max(191),
218
- maximumSpendUsd: z3.number().positive().finite(),
219
- maximumWallSeconds: z3.number().int().positive().max(21600)
220
- }).strict().superRefine((value, context) => {
221
- if (value.evaluationGpuType && value.mode !== "evaluation_only")
222
- context.addIssue({
223
- code: "custom",
224
- path: ["evaluationGpuType"],
225
- message: "GPU substitution requires explicit evaluation-only recovery"
226
- });
227
- const a = value.resourceApproval;
228
- if (a && (a.sourceJobVersion !== value.expectedVersion || a.checkpointId !== value.checkpointId || a.idempotencyKey !== value.idempotencyKey || a.maximumSpendUsd !== value.maximumSpendUsd || a.maximumWallSeconds !== value.maximumWallSeconds))
229
- context.addIssue({
230
- code: "custom",
231
- path: ["resourceApproval"],
232
- message: "Recovery resource approval does not match its request"
233
- });
234
- });
235
-
236
- // src/training-physical-placement.ts
237
- import { z as z4 } from "zod";
238
- var TrainingPhysicalPlacementSchema = z4.object({
239
- mode: z4.literal("reuse_only"),
240
- physicalWorkerId: z4.string().trim().min(1).max(191),
241
- providerPodId: z4.string().trim().min(1).max(191),
242
- workerImageDigest: z4.string().regex(/^sha256:[a-f0-9]{64}$/),
243
- baseProfileSha256: z4.string().regex(/^[a-f0-9]{64}$/),
244
- gpuType: z4.string().trim().min(1).max(200),
245
- sourceJobId: z4.string().trim().min(1).max(191),
246
- sourceInputManifestSha256: z4.string().regex(/^[a-f0-9]{64}$/),
247
- ownerTeamId: z4.string().trim().min(1).max(191),
248
- deadlineAt: z4.string().datetime({ offset: true })
249
- }).strict();
250
-
251
- // src/training-preparations.ts
252
- import { z as z5 } from "zod";
253
- var Id3 = z5.string().trim().min(1).max(191);
254
- var Hash2 = z5.string().regex(/^[a-f0-9]{64}$/);
255
- var TrainingPreparationRequestSchema = z5.object({
256
- schemaVersion: z5.literal("openpond.trainingPreparationRequest.v1"),
257
- teamId: Id3,
258
- operationId: Id3,
259
- projectId: Id3.nullable(),
260
- configuration: z5.object({ id: Id3, expectedRevision: z5.number().int().positive(), expectedEtag: Hash2 }).strict(),
261
- origin: TrainingHandoffOriginSchema.optional(),
262
- batch: ModelProjectVersionedRefSchema,
263
- name: z5.string().trim().min(1).max(191),
264
- maximumSpendUsd: z5.number().finite().positive().max(1e6),
265
- gpuSelection: TrainingGpuSelectionSchema.optional(),
266
- physicalPlacement: TrainingPhysicalPlacementSchema.optional()
267
- }).strict();
268
- var TrainingPreparationPlanContentSchema = z5.object({
269
- schemaVersion: z5.literal("openpond.trainingPreparationPlan.v1"),
270
- id: Id3,
271
- creatorUserId: Id3,
272
- request: TrainingPreparationRequestSchema,
273
- requestHash: Hash2,
274
- source: z5.lazy(() => TrainingJobSourceSchema),
275
- submissionHash: Hash2,
276
- createdAt: z5.string().datetime({ offset: true })
277
- }).strict();
278
- var TrainingPreparationPlanSchema = TrainingPreparationPlanContentSchema.extend({
279
- contentHash: Hash2
280
- }).strict();
281
- var TrainingPreparationReceiptSchema = z5.object({
282
- schemaVersion: z5.literal("openpond.trainingPreparationReceipt.v1"),
283
- plan: TrainingPreparationPlanSchema,
284
- revision: z5.number().int().positive(),
285
- state: z5.enum(["prepared", "submitted", "cancelled"]),
286
- jobId: Id3.nullable()
287
- }).strict().superRefine((value, context) => {
288
- if (value.state === "submitted" !== Boolean(value.jobId))
289
- context.addIssue({
290
- code: "custom",
291
- path: ["jobId"],
292
- message: "Only submitted preparations identify a job."
293
- });
294
- });
295
- var TrainingPreparationControlSchema = z5.object({
296
- teamId: Id3,
297
- planHash: Hash2,
298
- expectedRevision: z5.number().int().positive(),
299
- estimateReview: TrainingEstimateReviewSchema.optional()
300
- }).strict();
301
- var TrainingPreparationListQuerySchema = z5.object({
302
- projectId: Id3.optional(),
303
- state: z5.enum(["prepared", "submitted", "cancelled"]).optional(),
304
- afterId: Id3.optional(),
305
- limit: z5.number().int().min(1).max(100).default(25)
306
- }).strict();
307
- var TrainingPreparationPageSchema = z5.object({
308
- schemaVersion: z5.literal("openpond.trainingPreparationPage.v1"),
309
- teamId: Id3,
310
- items: z5.array(TrainingPreparationReceiptSchema).max(100),
311
- nextCursor: Id3.nullable()
312
- }).strict();
313
- async function parseAndVerifyTrainingPreparationReceipt(value) {
314
- const receipt = TrainingPreparationReceiptSchema.parse(value);
315
- const { contentHash, ...plan } = receipt.plan;
316
- if (await canonicalSha256(plan) !== contentHash || await canonicalSha256(plan.request) !== plan.requestHash || plan.source.modelProject.id !== plan.request.configuration.id || await canonicalSha256(plan.source.origin ?? null) !== await canonicalSha256(plan.request.origin ?? null)) {
317
- throw new OpenPondProtocolError(
318
- "training_preparation_mismatch",
319
- "The prepared training inputs changed."
320
- );
321
- }
322
- return receipt;
323
- }
324
- function createTrainingPreparationClient(request) {
325
- async function read(value, teamId, id2) {
326
- const receipt = await parseAndVerifyTrainingPreparationReceipt(value);
327
- if (receipt.plan.request.teamId !== teamId || id2 && receipt.plan.id !== id2)
328
- throw new OpenPondProtocolError(
329
- "training_preparation_scope_mismatch",
330
- "The training preparation belongs to a different workspace or request."
331
- );
332
- return receipt;
333
- }
334
- return {
335
- /** Discover the authenticated user's retained preparations without creating jobs. */
336
- async listPreparations(teamId, input = {}) {
337
- const scope = Id3.parse(teamId);
338
- const query = TrainingPreparationListQuerySchema.parse(input);
339
- const params = new URLSearchParams();
340
- for (const [key, value] of Object.entries(query)) params.set(key, String(value));
341
- const page = TrainingPreparationPageSchema.parse(
342
- await request(`/v1/training/preparations?${params}`)
343
- );
344
- if (page.teamId !== scope || page.items.length > query.limit || new Set(page.items.map((item) => item.plan.id)).size !== page.items.length || page.nextCursor !== null && (page.nextCursor !== page.items.at(-1)?.plan.id || page.nextCursor === query.afterId)) {
345
- throw new OpenPondProtocolError(
346
- "training_preparation_page_mismatch",
347
- "The preparation page does not match its workspace or cursor."
348
- );
349
- }
350
- const items = await Promise.all(
351
- page.items.map(async (item) => {
352
- const receipt = await read(item, scope);
353
- if (query.projectId && receipt.plan.request.projectId !== query.projectId || query.state && receipt.state !== query.state) {
354
- throw new OpenPondProtocolError(
355
- "training_preparation_page_mismatch",
356
- "A preparation does not match the requested Project or state."
357
- );
358
- }
359
- return receipt;
360
- })
361
- );
362
- return { ...page, items };
363
- },
364
- async prepareRun(input) {
365
- const parsed = TrainingPreparationRequestSchema.parse(input);
366
- const receipt = await read(
367
- await request("/v1/training/preparations", {
368
- method: "POST",
369
- body: JSON.stringify(parsed)
370
- }),
371
- parsed.teamId
372
- );
373
- if (receipt.plan.requestHash !== await canonicalSha256(parsed))
374
- throw new OpenPondProtocolError(
375
- "training_preparation_request_mismatch",
376
- "The preparation does not match the requested run."
377
- );
378
- return receipt;
379
- },
380
- async getPreparation(teamId, id2) {
381
- return read(
382
- await request(`/v1/training/preparations/${encodeURIComponent(Id3.parse(id2))}`),
383
- Id3.parse(teamId),
384
- id2
385
- );
386
- },
387
- async startPreparation(id2, input) {
388
- const parsed = TrainingPreparationControlSchema.parse(input);
389
- const receipt = await read(
390
- await request(`/v1/training/preparations/${encodeURIComponent(Id3.parse(id2))}/start`, {
391
- method: "POST",
392
- body: JSON.stringify(parsed)
393
- }),
394
- parsed.teamId,
395
- id2
396
- );
397
- if (receipt.plan.contentHash !== parsed.planHash || receipt.state !== "submitted")
398
- throw new OpenPondProtocolError(
399
- "training_preparation_start_mismatch",
400
- "The submitted run does not match the approved preparation."
401
- );
402
- return receipt;
403
- },
404
- async cancelPreparation(id2, input) {
405
- const parsed = TrainingPreparationControlSchema.parse(input);
406
- const receipt = await read(
407
- await request(`/v1/training/preparations/${encodeURIComponent(Id3.parse(id2))}/cancel`, {
408
- method: "POST",
409
- body: JSON.stringify(parsed)
410
- }),
411
- parsed.teamId,
412
- id2
413
- );
414
- if (receipt.plan.contentHash !== parsed.planHash || receipt.state !== "cancelled")
415
- throw new OpenPondProtocolError(
416
- "training_preparation_cancel_mismatch",
417
- "The preparation cancellation could not be verified."
418
- );
419
- return receipt;
420
- }
421
- };
422
- }
423
-
424
- // src/training-estimates.ts
425
- import { z as z6 } from "zod";
426
- var Id4 = z6.string().trim().min(1).max(191);
427
- var Hash3 = z6.string().regex(/^[a-f0-9]{64}$/);
428
- var Timestamp = z6.string().datetime({ offset: true });
429
- var NonNegative = z6.number().finite().nonnegative();
430
- var TrainingEstimateSourceSchema = z6.discriminatedUnion("kind", [
431
- z6.object({ kind: z6.literal("preparation"), id: Id4, planHash: Hash3, expectedRevision: z6.number().int().positive() }).strict(),
432
- z6.object({
433
- kind: z6.literal("configuration"),
434
- id: Id4,
435
- expectedRevision: z6.number().int().positive(),
436
- expectedEtag: Hash3,
437
- batch: ModelProjectVersionedRefSchema.nullable().default(null)
438
- }).strict(),
439
- z6.object({ kind: z6.literal("submission"), submission: z6.lazy(() => TrainingJobSubmissionSchema) }).strict()
440
- ]);
441
- var TrainingEstimateRequestSchema = z6.object({
442
- schemaVersion: z6.literal("openpond.trainingEstimateRequest.v1"),
443
- teamId: Id4,
444
- source: TrainingEstimateSourceSchema,
445
- gpuSelection: TrainingGpuSelectionSchema.optional()
446
- }).strict();
447
- var PlanningRange = z6.object({ low: NonNegative, high: NonNegative }).strict().refine((value) => value.high >= value.low, "Planning range must be ordered");
448
- var TrainingEstimateComponentSchema = z6.object({
449
- phase: z6.enum([
450
- "startup",
451
- "baseline_evaluation",
452
- "rollouts",
453
- "optimization",
454
- "checkpointing",
455
- "backbone_materialization",
456
- "final_evaluation",
457
- "publication",
458
- "cleanup",
459
- "retention"
460
- ]),
461
- resource: z6.enum(["gpu", "cpu", "judge", "storage", "network"]),
462
- expectedUsd: NonNegative.nullable(),
463
- expectedSeconds: NonNegative.nullable(),
464
- planningRangeUsd: PlanningRange.nullable(),
465
- evidence: z6.enum(["measured", "configured_rate", "unavailable"]),
466
- reason: z6.string().trim().min(1).max(1e3).nullable()
467
- }).strict();
468
- function trainingEstimateSourceIdentity(source) {
469
- if (source.kind === "submission") return {
470
- kind: source.kind,
471
- id: source.submission.idempotencyKey,
472
- contentHash: source.submission.contentHash,
473
- revision: null
474
- };
475
- if (source.kind === "preparation") return {
476
- kind: source.kind,
477
- id: source.id,
478
- contentHash: source.planHash,
479
- revision: source.expectedRevision
480
- };
481
- return { kind: source.kind, id: source.id, contentHash: source.expectedEtag, revision: source.expectedRevision };
482
- }
483
- var TrainingEstimateSchema = z6.object({
484
- schemaVersion: z6.literal("openpond.trainingEstimate.v1"),
485
- id: Id4,
486
- teamId: Id4,
487
- requestHash: Hash3,
488
- inputHash: Hash3,
489
- source: z6.object({
490
- kind: z6.enum(["preparation", "configuration", "submission"]),
491
- id: Id4,
492
- contentHash: Hash3,
493
- revision: z6.number().int().positive().nullable()
494
- }).strict(),
495
- status: z6.enum(["available", "partial", "insufficient_evidence"]),
496
- currency: z6.literal("USD"),
497
- createdAt: Timestamp,
498
- expiresAt: Timestamp,
499
- estimatorVersion: Id4,
500
- runtimeVersion: Id4,
501
- pricing: z6.object({ version: Id4, quoteExpiresAt: Timestamp.nullable() }).strict(),
502
- gpu: z6.object({
503
- requested: TrainingGpuSelectionSchema,
504
- resolved: z6.object({ availabilityId: Id4, gpuType: z6.string().min(1).max(256), gpuCount: z6.union([z6.literal(1), z6.literal(2)]) }).strict().nullable(),
505
- customerHourlyUsd: NonNegative.nullable(),
506
- availability: z6.enum(["available", "limited", "unavailable", "unknown"])
507
- }).strict(),
508
- configuration: z6.object({
509
- modelId: Id4,
510
- modelRevision: z6.string().min(1).max(256),
511
- method: Id4,
512
- loraRank: z6.number().int().positive().nullable(),
513
- adapterMode: z6.enum(["residual_append", "shared", "sequential_merge"]).nullable(),
514
- groups: z6.number().int().nonnegative().nullable(),
515
- rolloutConcurrency: z6.number().int().positive().nullable(),
516
- maxOutputTokens: z6.number().int().positive().nullable(),
517
- trainingRows: z6.number().int().nonnegative().nullable(),
518
- evaluationRows: z6.number().int().nonnegative().nullable(),
519
- retentionDays: z6.number().int().positive().nullable(),
520
- approvedMaximumUsd: NonNegative.nullable()
521
- }).strict(),
522
- cost: z6.object({
523
- expectedUsd: NonNegative.nullable(),
524
- planningRangeUsd: PlanningRange.nullable(),
525
- knownMinimumUsd: NonNegative,
526
- recommendedMaximumUsd: NonNegative.nullable(),
527
- minimumCleanupReserveUsd: NonNegative.nullable(),
528
- components: z6.array(TrainingEstimateComponentSchema).max(50)
529
- }).strict(),
530
- executionSeconds: z6.object({ expected: NonNegative.nullable(), planningRange: PlanningRange.nullable() }).strict(),
531
- queueWaitSeconds: z6.object({ expected: NonNegative, planningRange: PlanningRange.nullable() }).strict().nullable(),
532
- calibration: z6.object({
533
- version: Id4,
534
- cohortHash: Hash3,
535
- completedSamples: z6.number().int().nonnegative(),
536
- partialSamples: z6.number().int().nonnegative(),
537
- scope: z6.enum(["workspace", "authorized_aggregate"])
538
- }).strict(),
539
- assumptions: z6.array(z6.string().trim().min(1).max(1e3)).max(50),
540
- unknowns: z6.array(z6.string().trim().min(1).max(1e3)).max(50),
541
- review: TrainingEstimateReviewSchema
542
- }).strict().superRefine((estimate, context) => {
543
- if (estimate.review.estimateId !== estimate.id || estimate.review.inputHash !== estimate.inputHash || estimate.review.requestHash !== estimate.requestHash || estimate.review.pricingVersion !== estimate.pricing.version || estimate.review.expiresAt !== estimate.expiresAt) {
544
- context.addIssue({ code: "custom", path: ["review"], message: "Estimate review identity differs from the estimate" });
545
- }
546
- if (Date.parse(estimate.expiresAt) <= Date.parse(estimate.createdAt)) {
547
- context.addIssue({ code: "custom", path: ["expiresAt"], message: "Estimate must expire after its creation" });
548
- }
549
- if (estimate.status === "available" && (estimate.cost.expectedUsd === null || estimate.executionSeconds.expected === null || estimate.unknowns.length > 0)) {
550
- context.addIssue({ code: "custom", path: ["status"], message: "An available estimate requires complete cost and duration coverage" });
551
- }
552
- if (estimate.gpu.requested.mode === "manual" && estimate.gpu.resolved && (estimate.gpu.requested.availabilityId !== estimate.gpu.resolved.availabilityId || estimate.gpu.requested.gpuType !== estimate.gpu.resolved.gpuType)) {
553
- context.addIssue({ code: "custom", path: ["gpu"], message: "An explicit GPU offering cannot be substituted" });
554
- }
555
- if (estimate.gpu.resolved && estimate.gpu.resolved.gpuCount !== (estimate.gpu.requested.gpuCount ?? 1)) {
556
- context.addIssue({ code: "custom", path: ["gpu", "resolved", "gpuCount"], message: "The resolved GPU count must match the requested count" });
557
- }
558
- });
559
- function createTrainingEstimateClient(request) {
560
- return {
561
- async estimate(input) {
562
- const parsed = TrainingEstimateRequestSchema.parse(input);
563
- if (parsed.source.kind === "submission") await parseAndVerifyTrainingJobSubmission(parsed.source.submission);
564
- const result = TrainingEstimateSchema.parse(await request("/v1/training/estimates", {
565
- method: "POST",
566
- body: JSON.stringify(parsed)
567
- }));
568
- if (result.teamId !== parsed.teamId || result.requestHash !== await canonicalSha256(parsed) || await canonicalSha256(result.source) !== await canonicalSha256(trainingEstimateSourceIdentity(parsed.source)) || parsed.gpuSelection && await canonicalSha256(result.gpu.requested) !== await canonicalSha256(parsed.gpuSelection)) {
569
- throw new OpenPondProtocolError("training_estimate_scope_mismatch", "The estimate does not match the requested workspace and exact configuration.");
570
- }
571
- return result;
572
- }
573
- };
574
- }
575
-
576
- // src/training-queue.ts
577
- import { z as z7 } from "zod";
578
- var Timestamp2 = z7.string().datetime({ offset: true });
579
- var TrainingQueueStatusSchema = z7.object({
580
- ticketId: z7.string().trim().min(1).max(191),
581
- ticketNumber: z7.number().int().positive().max(Number.MAX_SAFE_INTEGER),
582
- label: z7.literal("Waiting for resources"),
583
- position: z7.number().int().positive().nullable(),
584
- positionScope: z7.literal("compatible_fair_queue"),
585
- enqueuedAt: Timestamp2,
586
- asOf: Timestamp2,
587
- estimate: z7.object({
588
- revision: z7.number().int().nonnegative(),
589
- estimatedStartAt: Timestamp2,
590
- expiresAt: Timestamp2,
591
- evidence: z7.enum(["observed_capacity", "measured_bootstrap", "scheduled_release"])
592
- }).strict().nullable()
593
- }).strict().superRefine((value, context) => {
594
- if (value.estimate && Date.parse(value.estimate.expiresAt) <= Date.parse(value.asOf))
595
- context.addIssue({ code: "custom", path: ["estimate"], message: "An expired queue forecast must be returned as unavailable" });
596
- });
597
-
598
- // src/training-harness-sources.ts
599
- import { z as z8 } from "zod";
600
- var TrainingHarnessSourcePublicationSchema = z8.object({
601
- schemaVersion: z8.literal("openpond.trainingHarnessSourcePublication.v1"),
602
- harnessRelease: ImmutableReleaseRefSchema,
603
- sourcePackageHash: z8.string().regex(/^[a-f0-9]{64}$/),
604
- sizeBytes: z8.number().int().positive().max(TRAINING_INPUT_ARTIFACT_MAX_BYTES)
605
- }).strict();
606
- function createTrainingHarnessSourceClient(request) {
607
- const route = (reference) => {
608
- const ref = ImmutableReleaseRefSchema.parse(reference);
609
- return `/v1/training/harness-sources/${encodeURIComponent(ref.id)}/${ref.contentHash}`;
610
- };
611
- return {
612
- async publishHarnessSource(value) {
613
- assertCanonicalPayloadSize(value, TRAINING_INPUT_ARTIFACT_MAX_BYTES, "Training Harness source");
614
- const source = validateSource(value);
615
- const portability = source.agentSnapshot.portability;
616
- if (!portability.portable || portability.blockers.length || portability.localOnlyAssetRefs.length || portability.hostPrivateAssetRefs.length || source.schemaVersion === "openpond.harnessSourcePackage.v1" && source.harnessRelease.files.some((file) => file.visibility !== "policy")) {
617
- throw new Error("Hosted training Harness publication requires portable, policy-visible source.");
618
- }
619
- const result = TrainingHarnessSourcePublicationSchema.parse(await request(route({ id: source.harnessRelease.id, contentHash: source.harnessRelease.contentHash }), { method: "PUT", body: JSON.stringify(source) }));
620
- if (result.harnessRelease.id !== source.harnessRelease.id || result.harnessRelease.contentHash !== source.harnessRelease.contentHash || result.sourcePackageHash !== source.contentHash) {
621
- throw new Error("Published Harness source differs from the selected immutable package.");
622
- }
623
- return result;
624
- },
625
- async getHarnessSource(reference) {
626
- const value = await request(route(reference), void 0, TRAINING_INPUT_ARTIFACT_MAX_BYTES);
627
- assertCanonicalPayloadSize(value, TRAINING_INPUT_ARTIFACT_MAX_BYTES, "Training Harness source");
628
- return validateSource(value, reference);
629
- }
630
- };
631
- }
632
- function validateSource(value, reference) {
633
- return typeof value === "object" && value !== null && Reflect.get(value, "schemaVersion") === "openpond.harnessPolicySourcePackage.v1" ? validateHarnessPolicySourcePackage(value, reference) : validateHarnessSourcePackage(value, reference);
634
- }
635
-
636
- // src/training-candidate-decisions.ts
637
- import { z as z9 } from "zod";
638
- var IdSchema = /* @__PURE__ */ (() => z9.string().trim().min(1).max(500))();
639
- var HashSchema = /* @__PURE__ */ (() => z9.string().regex(/^[a-f0-9]{64}$/))();
640
- var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() => z9.object({
641
- schemaVersion: z9.literal("openpond.trainingCandidateDecisionRequest.v1"),
642
- teamId: IdSchema,
643
- jobId: IdSchema,
644
- artifact: ModelProjectImmutableRefSchema,
645
- evaluation: ModelProjectImmutableRefSchema,
646
- executionReceipt: ModelProjectImmutableRefSchema,
647
- decision: z9.enum(["accepted", "rejected"]),
648
- reason: z9.string().trim().min(1).max(5e3),
649
- idempotencyKey: IdSchema,
650
- expectedDecision: ModelProjectImmutableRefSchema.nullable()
651
- }).strict())();
652
- var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z9.object({
653
- schemaVersion: z9.literal("openpond.trainingCandidateDecision.v1"),
654
- id: IdSchema,
655
- request: TrainingCandidateDecisionRequestSchema,
656
- revision: z9.number().int().positive(),
657
- actor: z9.object({ userId: IdSchema, kind: z9.enum(["user", "api_key", "agent_delegate"]), id: IdSchema }).strict(),
658
- decidedAt: z9.string().datetime({ offset: true }),
659
- contentHash: HashSchema
660
- }).strict().superRefine((value, context) => {
661
- if (value.revision === 1 !== (value.request.expectedDecision === null)) {
662
- context.addIssue({ code: "custom", path: ["revision"], message: "A first decision has no predecessor; later decisions must reference the prior decision." });
663
- }
664
- if (value.request.expectedDecision?.id === value.id) {
665
- context.addIssue({ code: "custom", path: ["request", "expectedDecision"], message: "A decision cannot supersede itself." });
666
- }
667
- }))();
668
- async function trainingCandidateDecisionHash(value) {
669
- const { contentHash: _contentHash, ...content } = value;
670
- return canonicalSha256(content);
671
- }
672
- async function parseAndVerifyTrainingCandidateDecision(value, expected) {
673
- assertCanonicalPayloadSize(value, 32768, "Training candidate decision");
674
- const parsed = TrainingCandidateDecisionSchema.parse(value);
675
- if (parsed.contentHash !== await trainingCandidateDecisionHash(parsed)) {
676
- throw new OpenPondProtocolError("content_hash_mismatch", "Training candidate decision content hash does not match.");
677
- }
678
- if (parsed.request.teamId !== expected.teamId || parsed.request.jobId !== expected.jobId || parsed.request.artifact.id !== expected.artifact.id || parsed.request.artifact.contentHash !== expected.artifact.contentHash) {
679
- throw new OpenPondProtocolError("candidate_decision_identity_mismatch", "Training candidate decision belongs to a different team, Job or artifact.");
680
- }
681
- if (expected.request && await canonicalSha256(parsed.request) !== await canonicalSha256(TrainingCandidateDecisionRequestSchema.parse(expected.request))) {
682
- throw new OpenPondProtocolError("candidate_decision_request_mismatch", "Training candidate decision does not match the submitted review.");
683
- }
684
- return parsed;
685
- }
686
- function createTrainingCandidateDecisionClient(request) {
687
- function route(target) {
688
- return `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(target.jobId))}/candidates/${encodeURIComponent(ModelProjectImmutableRefSchema.parse(target.artifact).id)}/decision`;
689
- }
690
- return {
691
- async candidateDecision(target, options = {}) {
692
- IdSchema.parse(target.teamId);
693
- const reference = options.decision ? ModelProjectImmutableRefSchema.parse(options.decision) : void 0;
694
- const query = reference ? `?decisionId=${encodeURIComponent(reference.id)}` : "";
695
- const response = z9.object({ decision: z9.unknown().nullable() }).strict().parse(await request(`${route(target)}${query}`));
696
- if (response.decision === null && !reference) return null;
697
- const decision = await parseAndVerifyTrainingCandidateDecision(response.decision, target);
698
- if (reference && (decision.id !== reference.id || decision.contentHash !== reference.contentHash)) {
699
- throw new OpenPondProtocolError("candidate_decision_identity_mismatch", "Training candidate decision does not match the requested history entry.");
700
- }
701
- return decision;
702
- },
703
- async recordCandidateDecision(input) {
704
- const parsed = TrainingCandidateDecisionRequestSchema.parse(input);
705
- const response = await request(route(parsed), { method: "POST", body: JSON.stringify(parsed) });
706
- return parseAndVerifyTrainingCandidateDecision(response, { ...parsed, request: parsed });
707
- }
708
- };
709
- }
710
-
711
- // src/training-evaluation-results.ts
712
- import { z as z10 } from "zod";
713
- var IdSchema2 = /* @__PURE__ */ (() => z10.string().trim().min(1).max(500))();
714
- var HashSchema2 = /* @__PURE__ */ (() => z10.string().regex(/^[a-f0-9]{64}$/))();
715
- var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() => z10.object({
716
- taskId: IdSchema2,
717
- taskSha256: HashSchema2,
718
- resultSha256: HashSchema2,
719
- input: z10.object({
720
- instruction: z10.string().max(1e6),
721
- context: z10.record(z10.string(), z10.unknown())
722
- }).strict(),
723
- output: z10.string().max(1e6),
724
- outputSha256: HashSchema2,
725
- score: z10.number().finite().min(0).max(1),
726
- evidence: z10.object({
727
- kind: z10.enum(["worker_command", "hosted_trace", "local_trace"]),
728
- id: IdSchema2
729
- }).strict()
730
- }).strict())();
731
- var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() => z10.object({
732
- schemaVersion: z10.literal("openpond.trainingEvaluationTaskPage.v1"),
733
- jobId: IdSchema2,
734
- teamId: IdSchema2,
735
- evaluation: ModelProjectImmutableRefSchema,
736
- kind: z10.enum(["baseline", "candidate"]),
737
- policyVersion: z10.number().int().nonnegative(),
738
- taskset: ModelProjectVersionedRefSchema,
739
- panelSha256: HashSchema2,
740
- offset: z10.number().int().nonnegative(),
741
- total: z10.number().int().min(1).max(1e4),
742
- tasks: z10.array(TrainingEvaluationTaskResultSchema).min(1).max(100),
743
- nextCursor: z10.string().regex(/^[1-9]\d*$/).nullable(),
744
- contentHash: HashSchema2
745
- }).strict().superRefine((page, context) => {
746
- const end = page.offset + page.tasks.length;
747
- const expectedCursor = end < page.total ? String(end) : null;
748
- if (end > page.total || page.nextCursor !== expectedCursor) {
749
- context.addIssue({ code: "custom", path: ["nextCursor"], message: "Evaluation pagination must cover consecutive task positions." });
750
- }
751
- if (new Set(page.tasks.map((task) => task.taskId)).size !== page.tasks.length) {
752
- context.addIssue({ code: "custom", path: ["tasks"], message: "Evaluation task identities must be unique." });
753
- }
754
- }))();
755
- async function trainingEvaluationTaskPageHash(value) {
756
- const { contentHash: _contentHash, ...content } = value;
757
- return canonicalSha256(content);
758
- }
759
- async function parseAndVerifyTrainingEvaluationTaskPage(value, expected) {
760
- assertCanonicalPayloadSize(value, TRAINING_API_RESPONSE_MAX_BYTES, "Training evaluation task page");
761
- const page = TrainingEvaluationTaskPageSchema.parse(value);
762
- const reference = ModelProjectImmutableRefSchema.parse(expected.evaluation);
763
- if (page.jobId !== IdSchema2.parse(expected.jobId) || page.evaluation.id !== reference.id || page.evaluation.contentHash !== reference.contentHash || page.offset !== (expected.offset ?? 0) || expected.teamId !== void 0 && page.teamId !== IdSchema2.parse(expected.teamId)) {
764
- throw new OpenPondProtocolError("evaluation_page_identity_mismatch", "Evaluation results differ from the requested Job, evaluation, or page.");
765
- }
766
- if (await trainingEvaluationTaskPageHash(page) !== page.contentHash) {
767
- throw new OpenPondProtocolError("evaluation_page_hash_mismatch", "Evaluation task page content hash did not match.");
768
- }
769
- for (const task of page.tasks) {
770
- if (await canonicalSha256(task.output) !== task.outputSha256) {
771
- throw new OpenPondProtocolError("evaluation_output_hash_mismatch", "A retained evaluation output hash did not match.");
772
- }
773
- }
774
- return page;
775
- }
776
-
777
- // src/training-grading-plan.ts
778
- import { z as z11 } from "zod";
779
- import { compileBoundGraders, RewardBindingSchema, RewardReleaseSchema } from "@openpond/evals/rewards";
780
- var GradersSchema = z11.array(z11.object({ id: z11.string().trim().min(1) }).catchall(z11.unknown())).min(1).max(1e3);
781
- var RewardExecutionSchema = z11.object({
782
- binding: RewardBindingSchema,
783
- rewards: z11.array(RewardReleaseSchema).min(1).max(100)
784
- }).strict();
785
- async function deterministicTrainingRewardSource(input) {
786
- const execution = input.rewardExecution ? RewardExecutionSchema.parse(input.rewardExecution) : null;
787
- const graders = GradersSchema.parse(execution ? compileBoundGraders(execution.binding, execution.rewards) : input.graders);
788
- if (new Set(graders.map((grader) => grader.id)).size !== graders.length) {
789
- throw new Error("Training grader identities must be unique.");
790
- }
791
- const hash2 = await canonicalSha256({ schemaVersion: "openpond.trainingGraderSet.v1", graders });
792
- return {
793
- kind: "deterministic",
794
- grader: { id: `training-graders-${hash2.slice(0, 32)}`, contentHash: hash2 },
795
- composer: execution ? { id: execution.binding.id, contentHash: execution.binding.contentHash } : null
796
- };
797
- }
798
-
799
- // src/training-evaluation-source.ts
800
- import { z as z12 } from "zod";
801
- var TRAINING_EVALUATION_SOURCE_PATH = "evaluation-source.json";
802
- var TaskIdentitySchema = z12.object({
803
- id: z12.string().trim().min(1),
804
- clusterKey: z12.string().trim().min(1),
805
- split: z12.enum(["train", "validation", "frozen_eval"])
806
- }).passthrough();
807
- var TrainingEvaluationSourceSchema = z12.object({
808
- schemaVersion: z12.literal("openpond.trainingEvaluationSource.v1"),
809
- taskset: ModelProjectVersionedRefSchema,
810
- tasks: z12.array(TaskIdentitySchema).min(1).max(1e4),
811
- assets: z12.array(z12.object({
812
- path: z12.string().trim().min(1).max(2e3),
813
- sha256: z12.string().regex(/^[a-f0-9]{64}$/),
814
- sizeBytes: z12.number().int().nonnegative(),
815
- encoding: z12.literal("base64"),
816
- content: z12.string().max(32 * 1024 * 1024)
817
- }).strict()).max(1e4)
818
- }).strict().superRefine((source, context) => {
819
- const ids = /* @__PURE__ */ new Set();
820
- source.tasks.forEach((task, index) => {
821
- if (task.split === "train") context.addIssue({ code: "custom", path: ["tasks", index, "split"], message: "Evaluation sources require held-out tasks." });
822
- if (ids.has(task.id)) context.addIssue({ code: "custom", path: ["tasks", index, "id"], message: "Evaluation task identities must be unique." });
823
- ids.add(task.id);
824
- });
825
- });
826
- function assertTrainingEvaluationIsolation(trainingTasks, evaluationTasks) {
827
- const training = z12.array(TaskIdentitySchema).min(1).max(1e4).parse(trainingTasks);
828
- const evaluation = z12.array(TaskIdentitySchema).min(1).max(1e4).parse(evaluationTasks);
829
- const trainIds = /* @__PURE__ */ new Set();
830
- const trainFamilies = /* @__PURE__ */ new Set();
831
- for (const task of training) {
832
- if (task.split !== "train") throw new Error("The training population contains a held-out task.");
833
- if (trainIds.has(task.id)) throw new Error("Training task identities must be unique.");
834
- trainIds.add(task.id);
835
- trainFamilies.add(task.clusterKey);
836
- }
837
- const evaluationIds = /* @__PURE__ */ new Set();
838
- for (const task of evaluation) {
839
- if (task.split === "train") throw new Error("The evaluation population contains a training task.");
840
- if (evaluationIds.has(task.id)) throw new Error("Evaluation task identities must be unique.");
841
- if (trainIds.has(task.id) || trainFamilies.has(task.clusterKey)) {
842
- throw new Error("Training and evaluation tasks or families overlap.");
843
- }
844
- evaluationIds.add(task.id);
845
- }
846
- }
847
- async function trainingEvaluationSourceRef(input) {
848
- const source = TrainingEvaluationSourceSchema.parse(input);
849
- const hash2 = await canonicalSha256(source);
850
- return { taskset: source.taskset, dataset: { id: `training-evaluation-${hash2.slice(0, 32)}`, contentHash: hash2 } };
851
- }
852
-
853
- // src/training.ts
854
- var IdSchema3 = z13.string().trim().min(1).max(500);
855
- var HashSchema3 = z13.string().regex(/^[a-f0-9]{64}$/);
856
- var TimestampSchema = z13.string().datetime({ offset: true });
857
- var TrainingInputArtifactUploadSchema = z13.object({
858
- schemaVersion: z13.literal("openpond.trainingInputArtifactUpload.v2"),
859
- kind: z13.enum(["portable_training_bundle", "reward_model_dataset"]),
860
- idempotencyKey: z13.string().trim().min(1).max(500),
861
- sourceManifest: ModelProjectImmutableRefSchema,
862
- payload: z13.unknown(),
863
- contentHash: HashSchema3
864
- }).strict();
865
- var TrainingInputArtifactSchema = z13.object({
866
- schemaVersion: z13.literal("openpond.trainingInputArtifact.v2"),
867
- kind: z13.enum(["portable_training_bundle", "reward_model_dataset"]),
868
- sourceManifest: ModelProjectImmutableRefSchema,
869
- artifactRef: z13.string().trim().min(1).max(2e3),
870
- contentHash: HashSchema3,
871
- sizeBytes: z13.number().int().positive(),
872
- createdAt: TimestampSchema
873
- }).strict();
874
- async function trainingInputArtifactUploadHash(upload) {
875
- const { contentHash: _contentHash, ...content } = upload;
876
- return canonicalSha256(content);
877
- }
878
- async function parseAndVerifyTrainingInputArtifactUpload(value) {
879
- assertCanonicalPayloadSize(value, TRAINING_INPUT_ARTIFACT_MAX_BYTES, "Training input artifact");
880
- const parsed = TrainingInputArtifactUploadSchema.parse(value);
881
- const expectedHash = await trainingInputArtifactUploadHash(parsed);
882
- if (parsed.contentHash !== expectedHash) {
883
- throw new OpenPondProtocolError(
884
- "content_hash_mismatch",
885
- `Training input artifact contentHash ${parsed.contentHash} does not match ${expectedHash}.`
886
- );
887
- }
888
- return parsed;
889
- }
890
- var TrainingJobKindSchema = z13.enum(["reward_model_train", "policy_optimize"]);
891
- var TrainingJobStateSchema = z13.enum([
892
- "queued",
893
- "admitting",
894
- "provisioning",
895
- "running",
896
- "stopping",
897
- "cancelling",
898
- "succeeded",
899
- "failed",
900
- "cancelled"
901
- ]);
902
- var TrainingCapabilityRequirementSchema = z13.object({
903
- id: IdSchema3,
904
- version: z13.string().trim().min(1).max(200).nullable().default(null),
905
- required: z13.boolean().default(true)
906
- }).strict();
907
- var TrainingJobSourceSchema = z13.object({
908
- origin: TrainingHandoffOriginSchema.optional(),
909
- modelProject: z13.object({
910
- id: IdSchema3,
911
- portableProjectId: IdSchema3,
912
- revision: z13.number().int().positive(),
913
- contentHash: HashSchema3
914
- }).strict(),
915
- harnessRunManifest: ModelProjectImmutableRefSchema,
916
- harnessRelease: ModelProjectImmutableRefSchema,
917
- taskset: ModelProjectVersionedRefSchema,
918
- tasksetRelease: ModelProjectImmutableRefSchema,
919
- evaluation: z13.object({
920
- taskset: ModelProjectVersionedRefSchema,
921
- dataset: ModelProjectImmutableRefSchema
922
- }).strict().nullable().optional(),
923
- dataset: ModelProjectImmutableRefSchema,
924
- evidenceSets: z13.array(ModelProjectImmutableRefSchema).max(1e4)
925
- }).strict();
926
- var RewardModelTrainingRequestSchema = z13.object({
927
- kind: z13.literal("reward_model_train"),
928
- baseModel: ModelProjectBaseModelSchema,
929
- preferenceDatasetRelease: ModelProjectImmutableRefSchema,
930
- processorRelease: ModelProjectImmutableRefSchema,
931
- recipe: z13.object({
932
- schemaVersion: z13.literal("openpond.rewardModelRecipe.v1"),
933
- method: z13.literal("reward_model"),
934
- parameterization: z13.literal("lora_with_scalar_head")
935
- }).catchall(z13.unknown())
936
- }).strict();
937
- var DeterministicRewardSourceSchema = z13.object({
938
- kind: z13.literal("deterministic"),
939
- grader: ModelProjectImmutableRefSchema,
940
- composer: ModelProjectImmutableRefSchema.nullable().default(null)
941
- }).strict();
942
- var LearnedRewardSourceSchema = z13.object({
943
- kind: z13.literal("learned_reward"),
944
- rewardModelVersion: ModelProjectImmutableRefSchema,
945
- qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
946
- evaluationReferences: z13.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
947
- scorerArtifact: z13.object({
948
- artifactRef: z13.string().trim().min(1).max(2e3),
949
- contentHash: HashSchema3,
950
- executionReceipt: ModelProjectImmutableRefSchema
951
- }).strict(),
952
- processorRelease: ModelProjectImmutableRefSchema,
953
- rewardComposerRelease: ModelProjectImmutableRefSchema
954
- }).strict();
955
- var TrainingQualificationBaseModelSchema = ModelProjectBaseModelSchema.extend({
956
- revision: z13.string().regex(/^[a-f0-9]{40,64}$/),
957
- tokenizerRevision: z13.string().regex(/^[a-f0-9]{40,64}$/),
958
- chatTemplateHash: HashSchema3
959
- }).strict();
960
- var PolicyOptimizationRequestSchema = z13.object({
961
- kind: z13.literal("policy_optimize"),
962
- /** Collect and grade one original-learner group without optimizer work. */
963
- executionMode: z13.literal("qualification").optional(),
964
- baseModel: ModelProjectBaseModelSchema,
965
- recipe: ModelProjectRecipeDocumentSchema,
966
- rewardSource: z13.discriminatedUnion("kind", [
967
- DeterministicRewardSourceSchema,
968
- LearnedRewardSourceSchema
969
- ]),
970
- resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
971
- }).strict().superRefine((job, context) => {
972
- if (job.recipe.method !== "sft") return;
973
- const recipe = SftRecipeSchema.safeParse(job.recipe);
974
- if (!recipe.success) {
975
- context.addIssue({
976
- code: "custom",
977
- path: ["recipe"],
978
- message: "The SFT recipe is incomplete or invalid."
979
- });
980
- return;
981
- }
982
- if (job.executionMode || job.resumeFrom || "continuation" in job.recipe)
983
- context.addIssue({
984
- code: "custom",
985
- message: "Initial managed SFT requires a fresh supervised run without rollout qualification or continuation."
986
- });
987
- if (recipe.data.baseModel.id !== job.baseModel.modelId || recipe.data.baseModel.revision !== job.baseModel.revision || recipe.data.baseModel.tokenizerRevision !== job.baseModel.tokenizerRevision || recipe.data.baseModel.chatTemplateHash !== job.baseModel.chatTemplateHash)
988
- context.addIssue({
989
- code: "custom",
990
- path: ["baseModel"],
991
- message: "The SFT recipe must pin the exact submitted base and tokenizer."
992
- });
993
- });
994
- var TrainingJobRequestSchema = z13.discriminatedUnion("kind", [
995
- RewardModelTrainingRequestSchema,
996
- PolicyOptimizationRequestSchema
997
- ]);
998
- var TrainingJobApprovalSchema = z13.object({
999
- approvalHash: HashSchema3,
1000
- approvedAt: TimestampSchema,
1001
- exportApproved: z13.boolean(),
1002
- maximumSpendUsd: z13.number().nonnegative(),
1003
- retentionDays: z13.number().int().nonnegative().nullable(),
1004
- region: z13.string().trim().min(1).max(200).nullable().default(null)
1005
- }).strict();
1006
- var TrainingJobSubmissionSchema = z13.object({
1007
- schemaVersion: z13.literal("openpond.trainingJobSubmission.v2"),
1008
- idempotencyKey: z13.string().trim().min(1).max(500),
1009
- name: z13.string().trim().min(1).max(200),
1010
- source: TrainingJobSourceSchema,
1011
- job: TrainingJobRequestSchema,
1012
- requestedCapabilities: z13.array(TrainingCapabilityRequirementSchema).max(1e3),
1013
- placementObjective: z13.enum(["fast", "balanced", "economical"]),
1014
- gpuSelection: TrainingGpuSelectionSchema.optional(),
1015
- physicalPlacement: TrainingPhysicalPlacementSchema.optional(),
1016
- budget: z13.object({
1017
- maximumSpendUsd: z13.number().nonnegative(),
1018
- maximumWallSeconds: z13.number().int().positive()
1019
- }).strict(),
1020
- approval: TrainingJobApprovalSchema,
1021
- contentHash: HashSchema3
1022
- }).strict().superRefine((submission, context) => {
1023
- const distributed = (submission.gpuSelection?.gpuCount ?? 1) === 2;
1024
- const distributedRequirement = submission.requestedCapabilities.some((requirement) => requirement.id === "managed_rl.policy.data_parallel" && requirement.version === "1" && requirement.required);
1025
- if (distributed !== distributedRequirement) {
1026
- context.addIssue({ code: "custom", path: ["requestedCapabilities"], message: "Two-GPU training must require managed_rl.policy.data_parallel@1 and bind gpuSelection.gpuCount to 2." });
1027
- }
1028
- if (distributed && (submission.job.kind !== "policy_optimize" || submission.job.executionMode || submission.job.recipe.method !== "grpo" || submission.physicalPlacement)) {
1029
- context.addIssue({ code: "custom", path: ["gpuSelection"], message: "Two-GPU execution requires exclusive GRPO policy training." });
1030
- }
1031
- if (submission.physicalPlacement && (submission.job.kind !== "policy_optimize" || submission.job.resumeFrom || submission.job.executionMode || submission.job.recipe.continuation !== void 0)) {
1032
- context.addIssue({ code: "custom", path: ["physicalPlacement"], message: "Reuse-only placement requires fresh-base policy training without continuation." });
1033
- }
1034
- if (submission.job.kind === "policy_optimize" && submission.job.executionMode === "qualification") {
1035
- const job = submission.job;
1036
- if (!TrainingQualificationBaseModelSchema.safeParse(job.baseModel).success) {
1037
- context.addIssue({ code: "custom", path: ["job", "baseModel"], message: "Qualification requires immutable model and tokenizer revisions and a SHA-256 chat-template pin." });
1038
- }
1039
- if (job.resumeFrom || job.recipe.continuation !== void 0 || job.rewardSource.kind !== "deterministic" || job.recipe.method !== "grpo") {
1040
- context.addIssue({
1041
- code: "custom",
1042
- path: ["job"],
1043
- message: "Qualification requires the original GRPO learner, deterministic reward, and no resume or continuation."
1044
- });
1045
- }
1046
- if (!submission.requestedCapabilities.some((requirement) => requirement.required && requirement.id === "managed_rl.policy.qualification" && requirement.version === "1")) {
1047
- context.addIssue({
1048
- code: "custom",
1049
- path: ["requestedCapabilities"],
1050
- message: "Qualification must require managed_rl.policy.qualification@1."
1051
- });
1052
- }
1053
- }
1054
- if (submission.approval.maximumSpendUsd !== submission.budget.maximumSpendUsd) {
1055
- context.addIssue({
1056
- code: "custom",
1057
- path: ["approval", "maximumSpendUsd"],
1058
- message: "Approved spend must equal the immutable Job budget."
1059
- });
1060
- }
1061
- });
1062
- async function trainingJobSubmissionHash(submission) {
1063
- const { contentHash: _contentHash, ...content } = submission;
1064
- return canonicalSha256(content);
1065
- }
1066
- async function parseAndVerifyTrainingJobSubmission(value) {
1067
- assertCanonicalPayloadSize(value, TRAINING_JOB_SUBMISSION_MAX_BYTES, "Training Job submission");
1068
- const parsed = TrainingJobSubmissionSchema.parse(value);
1069
- const expectedHash = await trainingJobSubmissionHash(parsed);
1070
- if (parsed.contentHash !== expectedHash) {
1071
- throw new OpenPondProtocolError(
1072
- "content_hash_mismatch",
1073
- `Training Job contentHash ${parsed.contentHash} does not match ${expectedHash}.`
1074
- );
1075
- }
1076
- return parsed;
1077
- }
1078
- var TrainingJobRecoverySchema = z13.object({
1079
- resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
1080
- mode: z13.literal("evaluation_only").optional(),
1081
- trainingWorkloadComplete: z13.boolean().optional(),
1082
- sourceJobId: IdSchema3,
1083
- checkpointId: IdSchema3,
1084
- policyVersion: z13.number().int().positive(),
1085
- completedGroups: z13.number().int().positive(),
1086
- optimizerMode: z13.literal("continue")
1087
- }).strict();
1088
- var TrainingJobSchema = z13.object({
1089
- schemaVersion: z13.literal("openpond.trainingJob.v2"),
1090
- id: IdSchema3,
1091
- teamId: IdSchema3,
1092
- kind: TrainingJobKindSchema,
1093
- executionMode: z13.literal("qualification").optional(),
1094
- recovery: TrainingJobRecoverySchema.optional(),
1095
- modelProjectId: IdSchema3,
1096
- portableProjectId: IdSchema3,
1097
- sourceProjectRevision: z13.number().int().positive(),
1098
- submissionHash: HashSchema3,
1099
- state: TrainingJobStateSchema,
1100
- queue: TrainingQueueStatusSchema.optional(),
1101
- phase: z13.string().trim().min(1).max(200),
1102
- version: z13.number().int().nonnegative(),
1103
- progress: z13.number().min(0).max(1),
1104
- rolloutProgress: z13.object({
1105
- groupsCompleted: z13.number().int().nonnegative(),
1106
- groupsTarget: z13.number().int().nonnegative(),
1107
- optimizerUpdatesApplied: z13.number().int().nonnegative(),
1108
- optimizerUpdatesSkipped: z13.number().int().nonnegative()
1109
- }).strict(),
1110
- accruedSpendUsd: z13.number().nonnegative(),
1111
- terminalReason: z13.string().trim().min(1).max(5e3).nullable(),
1112
- createdAt: TimestampSchema,
1113
- updatedAt: TimestampSchema,
1114
- completedAt: TimestampSchema.nullable()
1115
- }).strict();
1116
- var TrainingJobPageSchema = z13.object({
1117
- schemaVersion: z13.literal("openpond.trainingJobPage.v2"),
1118
- jobs: z13.array(TrainingJobSchema).max(1e3),
1119
- nextCursor: z13.string().trim().min(1).max(2e3).nullable()
1120
- }).strict();
1121
- var TrainingJobEventSchema = z13.object({
1122
- schemaVersion: z13.literal("openpond.trainingJobEvent.v2"),
1123
- id: IdSchema3,
1124
- jobId: IdSchema3,
1125
- sequence: z13.number().int().nonnegative(),
1126
- type: IdSchema3,
1127
- phase: z13.string().trim().min(1).max(200),
1128
- message: z13.string().trim().min(1).max(5e3).nullable(),
1129
- data: z13.record(z13.string(), z13.unknown()).default({}),
1130
- createdAt: TimestampSchema
1131
- }).strict();
1132
- var TrainingJobLogSchema = z13.object({
1133
- schemaVersion: z13.literal("openpond.trainingJobLog.v2"),
1134
- jobId: IdSchema3,
1135
- sequence: z13.number().int().nonnegative(),
1136
- level: z13.enum(["debug", "info", "warning", "error"]),
1137
- message: z13.string().max(2e4),
1138
- createdAt: TimestampSchema
1139
- }).strict();
1140
- var TrainingJobControlRequestSchema = z13.object({ expectedVersion: z13.number().int().nonnegative() }).strict();
1141
- var TrainingJobOutputSchema = z13.object({
1142
- schemaVersion: z13.literal("openpond.trainingJobOutput.v2"),
1143
- id: IdSchema3,
1144
- jobId: IdSchema3,
1145
- kind: z13.enum(["checkpoint", "adapter", "scorer", "metrics", "evaluation", "trace", "receipt"]),
1146
- artifactRef: z13.string().trim().min(1).max(2e3),
1147
- contentHash: HashSchema3,
1148
- sizeBytes: z13.number().int().nonnegative(),
1149
- metadata: z13.record(z13.string(), z13.unknown()).default({}),
1150
- createdAt: TimestampSchema
1151
- }).strict();
1152
- var TrainingQualificationEvidenceSchema = z13.object({
1153
- schemaVersion: z13.literal("openpond.trainingQualificationEvidence.v1"),
1154
- baseModel: TrainingQualificationBaseModelSchema,
1155
- group: ModelProjectImmutableRefSchema,
1156
- rolloutReceipts: z13.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
1157
- rewardEvidenceHash: HashSchema3,
1158
- groupsCompleted: z13.literal(1),
1159
- optimizerUpdatesApplied: z13.literal(0),
1160
- optimizerUpdatesSkipped: z13.literal(0),
1161
- trainingStepsCreated: z13.literal(0),
1162
- checkpointsCreated: z13.literal(0),
1163
- artifactsCreated: z13.literal(0)
1164
- }).strict().superRefine((evidence, context) => {
1165
- if (new Set(evidence.rolloutReceipts.map((receipt) => receipt.id)).size !== evidence.rolloutReceipts.length) {
1166
- context.addIssue({ code: "custom", path: ["rolloutReceipts"], message: "Qualification rollout receipt identities must be unique." });
1167
- }
1168
- });
1169
- var TrainingExecutionReceiptSchema = z13.object({
1170
- schemaVersion: z13.literal("openpond.trainingExecutionReceipt.v2"),
1171
- id: IdSchema3,
1172
- teamId: IdSchema3,
1173
- jobId: IdSchema3,
1174
- submissionHash: HashSchema3,
1175
- manifestHash: HashSchema3,
1176
- recipeHash: HashSchema3,
1177
- capabilityHash: HashSchema3,
1178
- runtimeRelease: ModelProjectImmutableRefSchema,
1179
- inputs: z13.array(ModelProjectImmutableRefSchema).max(1e4),
1180
- outputs: z13.array(ModelProjectImmutableRefSchema).max(1e4),
1181
- spendUsd: z13.number().nonnegative(),
1182
- durationSeconds: z13.number().nonnegative(),
1183
- cleanupComplete: z13.boolean(),
1184
- qualification: TrainingQualificationEvidenceSchema.optional(),
1185
- issuer: IdSchema3,
1186
- issuedAt: TimestampSchema,
1187
- signature: z13.string().trim().min(1).max(1e4).nullable()
1188
- }).strict();
1189
- async function trainingExecutionReceiptHash(receipt) {
1190
- return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));
1191
- }
1192
- async function parseAndVerifyTrainingExecutionReceipt(value, expected) {
1193
- const receipt = TrainingExecutionReceiptSchema.parse(value);
1194
- const expectedId = IdSchema3.parse(expected.id);
1195
- const expectedHash = HashSchema3.parse(expected.contentHash);
1196
- const actualHash = await trainingExecutionReceiptHash(receipt);
1197
- if (receipt.id !== expectedId || actualHash !== expectedHash) {
1198
- throw new OpenPondProtocolError(
1199
- "execution_receipt_mismatch",
1200
- "The execution receipt identity or canonical content hash did not match."
1201
- );
1202
- }
1203
- if (expected.teamId !== void 0 && receipt.teamId !== IdSchema3.parse(expected.teamId)) {
1204
- throw new OpenPondProtocolError(
1205
- "execution_receipt_team_mismatch",
1206
- "The execution receipt belongs to a different team."
1207
- );
1208
- }
1209
- if (expected.jobId !== void 0 && receipt.jobId !== IdSchema3.parse(expected.jobId)) {
1210
- throw new OpenPondProtocolError(
1211
- "execution_receipt_job_mismatch",
1212
- "The execution receipt belongs to a different Training Job."
1213
- );
1214
- }
1215
- if ((expected.requireCleanup ?? true) && !receipt.cleanupComplete) {
1216
- throw new OpenPondProtocolError(
1217
- "execution_cleanup_incomplete",
1218
- "The execution receipt does not attest complete terminal cleanup."
1219
- );
1220
- }
1221
- if (expected.qualificationSubmission) {
1222
- const submission = await parseAndVerifyTrainingJobSubmission(expected.qualificationSubmission);
1223
- if (submission.job.kind !== "policy_optimize" || submission.job.executionMode !== "qualification") {
1224
- throw new OpenPondProtocolError("qualification_submission_required", "Expected an immutable qualification submission.");
1225
- }
1226
- await assertTrainingQualificationReceipt(receipt, { submissionHash: submission.contentHash, baseModel: submission.job.baseModel, outputs: expected.outputs });
1227
- }
1228
- return receipt;
1229
- }
1230
- async function assertTrainingQualificationReceipt(receipt, expected) {
1231
- const evidence = TrainingQualificationEvidenceSchema.parse(receipt.qualification);
1232
- if (receipt.submissionHash !== expected.submissionHash || !receipt.cleanupComplete) {
1233
- throw new OpenPondProtocolError("qualification_receipt_mismatch", "Qualification must attest the expected submission and complete cleanup.");
1234
- }
1235
- if (expected.baseModel && await canonicalSha256(evidence.baseModel) !== await canonicalSha256(expected.baseModel)) {
1236
- throw new OpenPondProtocolError("qualification_learner_mismatch", "Qualification used a different original learner or tokenizer.");
1237
- }
1238
- if (expected.outputs?.some((output) => ["checkpoint", "adapter", "scorer"].includes(output.kind))) {
1239
- throw new OpenPondProtocolError("qualification_updated_artifact", "Qualification must not publish trained artifacts or checkpoints.");
1240
- }
1241
- }
1242
- var TrainingJobOutputsSchema = z13.object({
1243
- schemaVersion: z13.literal("openpond.trainingJobOutputs.v2"),
1244
- outputs: z13.array(TrainingJobOutputSchema).max(1e4),
1245
- receipt: TrainingExecutionReceiptSchema.nullable()
1246
- }).strict();
1247
- var TrainingPolicyLoraCapabilitiesSchema = z13.object({
1248
- workerImageDigest: z13.string().regex(/^sha256:[a-f0-9]{64}$/),
1249
- envelopeRank: z13.number().int().positive().max(256),
1250
- supportedRanks: z13.array(z13.number().int().positive().max(256)).max(256),
1251
- qualification: z13.object({ evidenceRef: z13.string().min(1), evidenceSha256: HashSchema3 }).strict().nullable(),
1252
- continuation: z13.object({
1253
- sharedRequiresSameRank: z13.literal(true),
1254
- mergedRequiresSameRank: z13.literal(true),
1255
- residualAppendRequiresFreeCapacity: z13.literal(true),
1256
- stageOptimizer: z13.literal("reset"),
1257
- interruptedRecoveryOptimizer: z13.literal("restore")
1258
- }).strict()
1259
- }).strict().superRefine((value, context) => {
1260
- if (new Set(value.supportedRanks).size !== value.supportedRanks.length || value.supportedRanks.some((rank) => rank > value.envelopeRank))
1261
- context.addIssue({ code: "custom", path: ["supportedRanks"], message: "Supported ranks must be unique and fit the physical adapter envelope." });
1262
- if (value.supportedRanks.length && !value.qualification)
1263
- context.addIssue({ code: "custom", path: ["qualification"], message: "Advertised ranks require immutable image qualification evidence." });
1264
- });
1265
- function supportsTrainingPolicyLoraRank(capabilities, rank, continuation) {
1266
- if (!capabilities.supportedRanks.includes(rank)) return false;
1267
- if (!continuation) return true;
1268
- return continuation.mode === "residual_append" ? continuation.parentEnabledRank + rank <= capabilities.envelopeRank : continuation.parentEnabledRank === rank;
1269
- }
1270
- var TrainingCapabilitiesSchema = z13.object({
1271
- schemaVersion: z13.literal("openpond.trainingCapabilities.v2"),
1272
- capabilityHash: HashSchema3,
1273
- jobKinds: z13.array(TrainingJobKindSchema),
1274
- methods: z13.array(z13.string().trim().min(1).max(200)),
1275
- executionModes: z13.array(z13.enum(["training", "qualification"])).optional(),
1276
- policyLora: TrainingPolicyLoraCapabilitiesSchema.optional(),
1277
- policyDataParallel: z13.object({
1278
- capability: z13.literal("managed_rl.policy.data_parallel"),
1279
- version: z13.literal("1"),
1280
- gpuCount: z13.literal(2),
1281
- worldSize: z13.literal(2),
1282
- backend: z13.literal("nccl"),
1283
- allocationMode: z13.literal("exclusive"),
1284
- workerImageDigest: z13.string().regex(/^sha256:[a-f0-9]{64}$/)
1285
- }).strict().optional(),
1286
- structuredOutputs: z13.object({
1287
- capability: z13.literal("work.structured-output.v1"),
1288
- harnessRuntimeHash: HashSchema3,
1289
- workHarnessHash: HashSchema3,
1290
- schemaHash: HashSchema3,
1291
- artifactHash: HashSchema3,
1292
- invalidDataRejected: z13.literal(true),
1293
- invalidBytesRejected: z13.literal(true)
1294
- }).strict().optional(),
1295
- placements: z13.array(z13.enum(["local", "remote", "colocated", "provider_native"])),
1296
- controls: z13.object({
1297
- cancel: z13.boolean(),
1298
- stopAfterGroup: z13.boolean(),
1299
- resumeFromCheckpoint: z13.boolean()
1300
- }).strict(),
1301
- estimates: z13.object({ schemaVersion: z13.literal("openpond.trainingEstimate.v1") }).strict().optional(),
1302
- limits: z13.object({
1303
- maximumSpendUsd: z13.number().nonnegative(),
1304
- maximumWallSeconds: z13.number().int().positive(),
1305
- maximumArtifactBytes: z13.number().int().positive()
1306
- }).strict(),
1307
- checkedAt: TimestampSchema,
1308
- expiresAt: TimestampSchema
1309
- }).strict();
1310
- function createTrainingClient(input) {
1311
- const request = createTrainingRequest(input);
1312
- return {
1313
- postTraining: createPostTrainingClient({ request }),
1314
- ...createTrainingPreparationClient(request),
1315
- ...createTrainingEstimateClient(request),
1316
- ...createTrainingAcceptanceClient(request),
1317
- ...createTrainingHardwareClient(request),
1318
- ...createTrainingHarnessSourceClient(request),
1319
- ...createTrainingCandidateDecisionClient(request),
1320
- async capabilities() {
1321
- return TrainingCapabilitiesSchema.parse(
1322
- unwrapObject(await request("/v1/training/capabilities"), "capabilities")
1323
- );
1324
- },
1325
- async gpuCatalog() {
1326
- return TrainingGpuCatalogSchema.parse(unwrapObject(await request("/v1/training/gpu-catalog"), "catalog"));
1327
- },
1328
- async stageArtifact(upload) {
1329
- const parsed = await parseAndVerifyTrainingInputArtifactUpload(upload);
1330
- return TrainingInputArtifactSchema.parse(
1331
- unwrapObject(
1332
- await request("/v1/training/artifacts", {
1333
- method: "POST",
1334
- body: JSON.stringify(parsed)
1335
- }),
1336
- "artifact"
1337
- )
1338
- );
1339
- },
1340
- async createJob(submission) {
1341
- const parsed = await parseAndVerifyTrainingJobSubmission(submission);
1342
- return TrainingJobSchema.parse(
1343
- unwrapObject(
1344
- await request("/v1/training/jobs", {
1345
- method: "POST",
1346
- body: JSON.stringify(parsed)
1347
- }),
1348
- "job"
1349
- )
1350
- );
1351
- },
1352
- async listJobs(options = {}) {
1353
- const parameters = new URLSearchParams();
1354
- if (options.modelProjectId) {
1355
- parameters.set("modelProjectId", IdSchema3.parse(options.modelProjectId));
1356
- }
1357
- if (options.cursor) {
1358
- parameters.set("cursor", z13.string().trim().min(1).max(2e3).parse(options.cursor));
1359
- }
1360
- if (options.limit !== void 0) {
1361
- parameters.set("limit", String(z13.number().int().min(1).max(1e3).parse(options.limit)));
1362
- }
1363
- const query = parameters.size > 0 ? `?${parameters.toString()}` : "";
1364
- return TrainingJobPageSchema.parse(await request(`/v1/training/jobs${query}`));
1365
- },
1366
- async getJob(jobId) {
1367
- return TrainingJobSchema.parse(
1368
- unwrapObject(
1369
- await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}`),
1370
- "job"
1371
- )
1372
- );
1373
- },
1374
- async cancelJob(jobId, expectedVersion) {
1375
- const control = TrainingJobControlRequestSchema.parse({ expectedVersion });
1376
- return TrainingJobSchema.parse(
1377
- unwrapObject(
1378
- await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/cancel`, {
1379
- method: "POST",
1380
- body: JSON.stringify(control)
1381
- }),
1382
- "job"
1383
- )
1384
- );
1385
- },
1386
- async stopAfterGroup(jobId, expectedVersion) {
1387
- const control = TrainingJobControlRequestSchema.parse({ expectedVersion });
1388
- return TrainingJobSchema.parse(
1389
- unwrapObject(
1390
- await request(
1391
- `/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/stop-after-group`,
1392
- { method: "POST", body: JSON.stringify(control) }
1393
- ),
1394
- "job"
1395
- )
1396
- );
1397
- },
1398
- async recoverCheckpoint(jobId, input2) {
1399
- const recovery = TrainingCheckpointRecoveryRequestSchema.parse(input2);
1400
- if (recovery.resourceApproval) {
1401
- const { approvalHash, ...body } = recovery.resourceApproval;
1402
- if (body.sourceJobId !== jobId || await canonicalSha256(body) !== approvalHash)
1403
- throw new OpenPondProtocolError("content_hash_mismatch", "Recovery resource approval does not bind this source request.");
1404
- }
1405
- return TrainingJobSchema.parse(unwrapObject(await request(
1406
- `/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/recover`,
1407
- { method: "POST", body: JSON.stringify(recovery) }
1408
- ), "job"));
1409
- },
1410
- async events(jobId) {
1411
- return z13.array(TrainingJobEventSchema).parse(
1412
- unwrapObject(
1413
- await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/events`),
1414
- "events"
1415
- )
1416
- );
1417
- },
1418
- async outputs(jobId) {
1419
- return TrainingJobOutputsSchema.parse(
1420
- await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/outputs`)
1421
- );
1422
- },
1423
- async evaluationTasks(jobId, evaluation, options = {}) {
1424
- const id2 = IdSchema3.parse(jobId);
1425
- const reference = ModelProjectImmutableRefSchema.parse(evaluation);
1426
- const parameters = new URLSearchParams();
1427
- const cursor = options.cursor === void 0 ? void 0 : z13.string().regex(/^[1-9]\d*$/).parse(options.cursor);
1428
- const offset = cursor === void 0 ? 0 : z13.number().int().min(1).max(9999).parse(Number(cursor));
1429
- if (cursor !== void 0) parameters.set("cursor", cursor);
1430
- if (options.limit !== void 0)
1431
- parameters.set("limit", String(z13.number().int().min(1).max(100).parse(options.limit)));
1432
- const query = parameters.size ? `?${parameters.toString()}` : "";
1433
- return parseAndVerifyTrainingEvaluationTaskPage(
1434
- await request(
1435
- `/v1/training/jobs/${encodeURIComponent(id2)}/evaluations/${encodeURIComponent(reference.id)}/tasks${query}`
1436
- ),
1437
- { jobId: id2, evaluation: reference, offset }
1438
- );
1439
- },
1440
- async logs(jobId) {
1441
- return z13.array(TrainingJobLogSchema).max(1e5).parse(
1442
- unwrapObject(
1443
- await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/logs`),
1444
- "logs"
1445
- )
1446
- );
1447
- }
1448
- };
1449
- }
1450
- function unwrapObject(value, key) {
1451
- if (!value || typeof value !== "object" || Array.isArray(value)) return value;
1452
- return key in value ? value[key] : value;
1453
- }
1454
-
1455
- export {
1456
- SftRecipeSchema,
1457
- ManagedSftRecipeSchema,
1458
- TrainingAcceptanceGroupReferenceSchema,
1459
- TrainingAcceptanceGroupSummarySchema,
1460
- TrainingAcceptanceGroupPageSchema,
1461
- TrainingAcceptanceGroupQuerySchema,
1462
- TrainingCheckpointRecoveryResourceApprovalSchema,
1463
- createTrainingCheckpointRecoveryResourceApproval,
1464
- TrainingCheckpointRecoveryRequestSchema,
1465
- TrainingPhysicalPlacementSchema,
1466
- TrainingPreparationRequestSchema,
1467
- TrainingPreparationPlanContentSchema,
1468
- TrainingPreparationPlanSchema,
1469
- TrainingPreparationReceiptSchema,
1470
- TrainingPreparationControlSchema,
1471
- TrainingPreparationListQuerySchema,
1472
- TrainingPreparationPageSchema,
1473
- parseAndVerifyTrainingPreparationReceipt,
1474
- TrainingEstimateSourceSchema,
1475
- TrainingEstimateRequestSchema,
1476
- TrainingEstimateComponentSchema,
1477
- trainingEstimateSourceIdentity,
1478
- TrainingEstimateSchema,
1479
- TrainingQueueStatusSchema,
1480
- TrainingHarnessSourcePublicationSchema,
1481
- TrainingCandidateDecisionRequestSchema,
1482
- TrainingCandidateDecisionSchema,
1483
- trainingCandidateDecisionHash,
1484
- parseAndVerifyTrainingCandidateDecision,
1485
- TrainingEvaluationTaskResultSchema,
1486
- TrainingEvaluationTaskPageSchema,
1487
- trainingEvaluationTaskPageHash,
1488
- parseAndVerifyTrainingEvaluationTaskPage,
1489
- deterministicTrainingRewardSource,
1490
- TRAINING_EVALUATION_SOURCE_PATH,
1491
- TrainingEvaluationSourceSchema,
1492
- assertTrainingEvaluationIsolation,
1493
- trainingEvaluationSourceRef,
1494
- TrainingInputArtifactUploadSchema,
1495
- TrainingInputArtifactSchema,
1496
- trainingInputArtifactUploadHash,
1497
- parseAndVerifyTrainingInputArtifactUpload,
1498
- TrainingJobKindSchema,
1499
- TrainingJobStateSchema,
1500
- TrainingCapabilityRequirementSchema,
1501
- TrainingJobSourceSchema,
1502
- RewardModelTrainingRequestSchema,
1503
- TrainingQualificationBaseModelSchema,
1504
- PolicyOptimizationRequestSchema,
1505
- TrainingJobRequestSchema,
1506
- TrainingJobApprovalSchema,
1507
- TrainingJobSubmissionSchema,
1508
- trainingJobSubmissionHash,
1509
- parseAndVerifyTrainingJobSubmission,
1510
- TrainingJobRecoverySchema,
1511
- TrainingJobSchema,
1512
- TrainingJobPageSchema,
1513
- TrainingJobEventSchema,
1514
- TrainingJobLogSchema,
1515
- TrainingJobControlRequestSchema,
1516
- TrainingJobOutputSchema,
1517
- TrainingQualificationEvidenceSchema,
1518
- TrainingExecutionReceiptSchema,
1519
- trainingExecutionReceiptHash,
1520
- parseAndVerifyTrainingExecutionReceipt,
1521
- assertTrainingQualificationReceipt,
1522
- TrainingJobOutputsSchema,
1523
- TrainingPolicyLoraCapabilitiesSchema,
1524
- supportsTrainingPolicyLoraRank,
1525
- TrainingCapabilitiesSchema,
1526
- createTrainingClient
1527
- };
1528
- //# sourceMappingURL=chunk-GJRXJL6G.js.map