@toloka-platform/sdk 0.1.0-preview.9 → 0.2.0-preview.1

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 (286) hide show
  1. package/README.md +6 -5
  2. package/dist/cli/toloka.js +143 -139
  3. package/dist/cli/toloka.js.jsc +0 -0
  4. package/dist/cli/toloka.js.jsc.sha256 +1 -1
  5. package/dist/cli/toloka.js.sha256 +1 -1
  6. package/docs/authoring.md +9 -4
  7. package/docs/cli-v2.md +3 -3
  8. package/docs/cli.md +16 -3
  9. package/docs/getting-started.md +4 -4
  10. package/docs/limitations.md +3 -3
  11. package/docs/testing.md +1 -1
  12. package/examples/face-image-collection/README.md +1 -1
  13. package/openapi/gen/api.ts +1482 -777
  14. package/openapi/gen/models/createDatasetExportBody.ts +5 -3
  15. package/openapi/gen/models/createDatasetExportBodyFormat.ts +2 -0
  16. package/openapi/gen/models/createProjectTrainingBody.ts +6 -0
  17. package/openapi/gen/models/createTrainingRunBody.ts +6 -0
  18. package/openapi/gen/models/datasetExportReportTokens.ts +4 -1
  19. package/openapi/gen/models/datasetExportReportTokensEstimatorVersion.ts +2 -0
  20. package/openapi/gen/models/datasetExportReportTokensTotal.ts +2 -0
  21. package/openapi/gen/models/estimateTrainingCostBody.ts +5 -0
  22. package/openapi/gen/models/exportJob.ts +2 -0
  23. package/openapi/gen/models/exportJobError.ts +3 -0
  24. package/openapi/gen/models/exportJobErrorAnyOf.ts +7 -0
  25. package/openapi/gen/models/exportJobErrorAnyOfCode.ts +2 -0
  26. package/openapi/gen/models/exportJobStatus.ts +1 -1
  27. package/openapi/gen/models/getTrainingRunLogsParams.ts +5 -0
  28. package/openapi/gen/models/gistingTrainingConfiguration.ts +13 -0
  29. package/openapi/gen/models/gistingTrainingConfigurationInput.ts +13 -0
  30. package/openapi/gen/models/gistingTrainingConfigurationInputRegime.ts +2 -0
  31. package/openapi/gen/models/gistingTrainingConfigurationRegime.ts +2 -0
  32. package/openapi/gen/models/index.ts +230 -16
  33. package/openapi/gen/models/listProjectTrainings200.ts +7 -0
  34. package/openapi/gen/models/listProjectTrainingsParams.ts +5 -0
  35. package/openapi/gen/models/listTrainingRuns200.ts +7 -0
  36. package/openapi/gen/models/listTrainingRunsParams.ts +5 -0
  37. package/openapi/gen/models/modelVersion.ts +6 -1
  38. package/openapi/gen/models/modelVersionContent.ts +4 -0
  39. package/openapi/gen/models/modelVersionContentDownload.ts +11 -0
  40. package/openapi/gen/models/modelVersionContentDownloadContent.ts +4 -0
  41. package/openapi/gen/models/modelVersionContentDownloadContentOneOf.ts +10 -0
  42. package/openapi/gen/models/modelVersionContentDownloadContentOneOfManifestItem.ts +8 -0
  43. package/openapi/gen/models/modelVersionContentDownloadContentOneOfManifestItemMediaType.ts +2 -0
  44. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNine.ts +8 -0
  45. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNineManifestItem.ts +8 -0
  46. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNineManifestItemMediaType.ts +2 -0
  47. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNineRuntimeBase.ts +2 -0
  48. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParent.ts +4 -0
  49. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParentOneOf.ts +6 -0
  50. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParentOneOfBaseModelId.ts +2 -0
  51. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParentOneOfThree.ts +5 -0
  52. package/openapi/gen/models/modelVersionContentDownloadContentOneOfRuntimeBase.ts +2 -0
  53. package/openapi/gen/models/modelVersionContentDownloadFilesItem.ts +9 -0
  54. package/openapi/gen/models/modelVersionContentDownloadFilesItemMediaType.ts +2 -0
  55. package/openapi/gen/models/modelVersionContentOneOf.ts +10 -0
  56. package/openapi/gen/models/modelVersionContentOneOfManifestItem.ts +8 -0
  57. package/openapi/gen/models/modelVersionContentOneOfManifestItemMediaType.ts +2 -0
  58. package/openapi/gen/models/modelVersionContentOneOfNine.ts +8 -0
  59. package/openapi/gen/models/modelVersionContentOneOfNineManifestItem.ts +8 -0
  60. package/openapi/gen/models/modelVersionContentOneOfNineManifestItemMediaType.ts +2 -0
  61. package/openapi/gen/models/modelVersionContentOneOfNineRuntimeBase.ts +2 -0
  62. package/openapi/gen/models/modelVersionContentOneOfParent.ts +4 -0
  63. package/openapi/gen/models/modelVersionContentOneOfParentOneOf.ts +6 -0
  64. package/openapi/gen/models/modelVersionContentOneOfParentOneOfBaseModelId.ts +2 -0
  65. package/openapi/gen/models/modelVersionContentOneOfParentOneOfThree.ts +5 -0
  66. package/openapi/gen/models/modelVersionContentOneOfRuntimeBase.ts +2 -0
  67. package/openapi/gen/models/modelVersionProducer.ts +5 -0
  68. package/openapi/gen/models/prepareTrainingCostEstimateInputsBody.ts +2 -0
  69. package/openapi/gen/models/replaceTrainingConfigurationBody.ts +5 -0
  70. package/openapi/gen/models/sftTrainingConfiguration.ts +13 -0
  71. package/openapi/gen/models/sftTrainingConfigurationInput.ts +13 -0
  72. package/openapi/gen/models/sftTrainingConfigurationInputRegime.ts +2 -0
  73. package/openapi/gen/models/sftTrainingConfigurationRegime.ts +2 -0
  74. package/openapi/gen/models/training.ts +16 -0
  75. package/openapi/gen/models/trainingArchivedAt.ts +2 -0
  76. package/openapi/gen/models/trainingConfiguration.ts +4 -0
  77. package/openapi/gen/models/trainingConfigurationInput.ts +4 -0
  78. package/openapi/gen/models/trainingCostEstimate.ts +4 -0
  79. package/openapi/gen/models/trainingCostEstimateInputSet.ts +12 -0
  80. package/openapi/gen/models/trainingCostEstimateInputSetExports.ts +6 -0
  81. package/openapi/gen/models/trainingCostEstimateInputSetExportsValidation.ts +2 -0
  82. package/openapi/gen/models/trainingCostEstimateInputSetId.ts +2 -0
  83. package/openapi/gen/models/trainingCostEstimateOneOf.ts +16 -0
  84. package/openapi/gen/models/trainingCostEstimateOneOfInputs.ts +7 -0
  85. package/openapi/gen/models/trainingCostEstimateOneOfInputsTraining.ts +9 -0
  86. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingFailure.ts +3 -0
  87. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingFailureAnyOf.ts +7 -0
  88. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingFailureAnyOfCode.ts +2 -0
  89. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReport.ts +3 -0
  90. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOf.ts +9 -0
  91. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfErrorsItem.ts +5 -0
  92. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfTokens.ts +10 -0
  93. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfTokensEstimatorVersion.ts +2 -0
  94. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfTokensTotal.ts +2 -0
  95. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidation.ts +3 -0
  96. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOf.ts +9 -0
  97. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfFailure.ts +3 -0
  98. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfFailureAnyOf.ts +7 -0
  99. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfFailureAnyOfCode.ts +2 -0
  100. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReport.ts +3 -0
  101. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOf.ts +9 -0
  102. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfErrorsItem.ts +5 -0
  103. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfTokens.ts +10 -0
  104. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfTokensEstimatorVersion.ts +2 -0
  105. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfTokensTotal.ts +2 -0
  106. package/openapi/gen/models/trainingCostEstimateOneOfIssuesItem.ts +8 -0
  107. package/openapi/gen/models/trainingCostEstimateOneOfIssuesItemCode.ts +2 -0
  108. package/openapi/gen/models/trainingCostEstimateOneOfIssuesItemPurpose.ts +2 -0
  109. package/openapi/gen/models/trainingCostEstimateOneOfTwoseven.ts +23 -0
  110. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenBudget.ts +9 -0
  111. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputs.ts +7 -0
  112. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTraining.ts +9 -0
  113. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingFailure.ts +3 -0
  114. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingFailureAnyOf.ts +7 -0
  115. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingFailureAnyOfCode.ts +2 -0
  116. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReport.ts +3 -0
  117. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOf.ts +9 -0
  118. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfErrorsItem.ts +5 -0
  119. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfTokens.ts +10 -0
  120. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfTokensEstimatorVersion.ts +2 -0
  121. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfTokensTotal.ts +2 -0
  122. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidation.ts +3 -0
  123. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOf.ts +9 -0
  124. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfFailure.ts +3 -0
  125. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfFailureAnyOf.ts +7 -0
  126. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfFailureAnyOfCode.ts +2 -0
  127. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReport.ts +3 -0
  128. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOf.ts +9 -0
  129. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfErrorsItem.ts +5 -0
  130. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfTokens.ts +10 -0
  131. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfTokensEstimatorVersion.ts +2 -0
  132. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfTokensTotal.ts +2 -0
  133. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenIssuesItem.ts +8 -0
  134. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenIssuesItemCode.ts +2 -0
  135. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenIssuesItemPurpose.ts +2 -0
  136. package/openapi/gen/models/trainingDatasetItemFilter.ts +8 -0
  137. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItem.ts +6 -0
  138. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItemSourcesItem.ts +4 -0
  139. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItemSourcesItemOneOf.ts +5 -0
  140. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  141. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItem.ts +12 -0
  142. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemOperator.ts +2 -0
  143. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemSourcesItem.ts +4 -0
  144. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemSourcesItemOneOf.ts +5 -0
  145. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  146. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemValue.ts +2 -0
  147. package/openapi/gen/models/trainingDatasetItemFilterInput.ts +8 -0
  148. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItem.ts +6 -0
  149. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItemSourcesItem.ts +4 -0
  150. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItemSourcesItemOneOf.ts +5 -0
  151. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  152. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItem.ts +12 -0
  153. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemOperator.ts +2 -0
  154. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemSourcesItem.ts +4 -0
  155. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemSourcesItemOneOf.ts +5 -0
  156. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  157. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemValue.ts +2 -0
  158. package/openapi/gen/models/trainingDatasetSelection.ts +6 -0
  159. package/openapi/gen/models/trainingDatasetSelectionInput.ts +6 -0
  160. package/openapi/gen/models/trainingId.ts +2 -0
  161. package/openapi/gen/models/trainingModelId.ts +3 -0
  162. package/openapi/gen/models/trainingModelSource.ts +4 -0
  163. package/openapi/gen/models/trainingModelSourceOneOf.ts +6 -0
  164. package/openapi/gen/models/trainingModelSourceOneOfBaseModelId.ts +2 -0
  165. package/openapi/gen/models/trainingModelSourceOneOfThree.ts +5 -0
  166. package/openapi/gen/models/trainingRun.ts +39 -0
  167. package/openapi/gen/models/trainingRunBillingStatus.ts +2 -0
  168. package/openapi/gen/models/trainingRunBlockedReason.ts +2 -0
  169. package/openapi/gen/models/trainingRunChargedAmount.ts +2 -0
  170. package/openapi/gen/models/trainingRunError.ts +3 -0
  171. package/openapi/gen/models/trainingRunErrorAnyOf.ts +7 -0
  172. package/openapi/gen/models/trainingRunErrorAnyOfCode.ts +2 -0
  173. package/openapi/gen/models/trainingRunId.ts +2 -0
  174. package/openapi/gen/models/trainingRunInputs.ts +3 -0
  175. package/openapi/gen/models/trainingRunInputsAnyOf.ts +7 -0
  176. package/openapi/gen/models/trainingRunInputsAnyOfTraining.ts +15 -0
  177. package/openapi/gen/models/trainingRunInputsAnyOfTrainingContract.ts +2 -0
  178. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilter.ts +9 -0
  179. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItem.ts +6 -0
  180. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItemSourcesItem.ts +4 -0
  181. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItemSourcesItemOneOf.ts +5 -0
  182. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  183. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItem.ts +12 -0
  184. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemOperator.ts +2 -0
  185. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemSourcesItem.ts +4 -0
  186. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemSourcesItemOneOf.ts +5 -0
  187. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  188. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemValue.ts +2 -0
  189. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReport.ts +9 -0
  190. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportErrorsItem.ts +5 -0
  191. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportTokens.ts +10 -0
  192. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportTokensEstimatorVersion.ts +2 -0
  193. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportTokensTotal.ts +2 -0
  194. package/openapi/gen/models/trainingRunInputsAnyOfValidation.ts +3 -0
  195. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOf.ts +15 -0
  196. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfContract.ts +2 -0
  197. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilter.ts +9 -0
  198. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItem.ts +6 -0
  199. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItemSourcesItem.ts +4 -0
  200. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItemSourcesItemOneOf.ts +5 -0
  201. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  202. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItem.ts +12 -0
  203. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemOperator.ts +2 -0
  204. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemSourcesItem.ts +4 -0
  205. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemSourcesItemOneOf.ts +5 -0
  206. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  207. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemValue.ts +2 -0
  208. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReport.ts +9 -0
  209. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportErrorsItem.ts +5 -0
  210. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportTokens.ts +10 -0
  211. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportTokensEstimatorVersion.ts +2 -0
  212. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportTokensTotal.ts +2 -0
  213. package/openapi/gen/models/trainingRunLogs.ts +9 -0
  214. package/openapi/gen/models/trainingRunLogsEntriesItem.ts +7 -0
  215. package/openapi/gen/models/trainingRunLogsEntriesItemLevel.ts +2 -0
  216. package/openapi/gen/models/trainingRunLogsNextCursor.ts +2 -0
  217. package/openapi/gen/models/trainingRunMessage.ts +2 -0
  218. package/openapi/gen/models/trainingRunOutputModelVersionRevision.ts +2 -0
  219. package/openapi/gen/models/trainingRunProgress.ts +3 -0
  220. package/openapi/gen/models/trainingRunProgressAnyOf.ts +10 -0
  221. package/openapi/gen/models/trainingRunProgressAnyOfMessage.ts +2 -0
  222. package/openapi/gen/models/trainingRunProgressAnyOfStep.ts +2 -0
  223. package/openapi/gen/models/trainingRunProgressAnyOfTotal.ts +2 -0
  224. package/openapi/gen/models/trainingRunQuote.ts +17 -0
  225. package/openapi/gen/models/trainingRunQuoteBudget.ts +9 -0
  226. package/openapi/gen/models/trainingRunQuoteInputs.ts +7 -0
  227. package/openapi/gen/models/trainingRunQuoteInputsTraining.ts +9 -0
  228. package/openapi/gen/models/trainingRunQuoteInputsTrainingFailure.ts +3 -0
  229. package/openapi/gen/models/trainingRunQuoteInputsTrainingFailureAnyOf.ts +7 -0
  230. package/openapi/gen/models/trainingRunQuoteInputsTrainingFailureAnyOfCode.ts +2 -0
  231. package/openapi/gen/models/trainingRunQuoteInputsTrainingReport.ts +3 -0
  232. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOf.ts +9 -0
  233. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfErrorsItem.ts +5 -0
  234. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfTokens.ts +10 -0
  235. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfTokensEstimatorVersion.ts +2 -0
  236. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfTokensTotal.ts +2 -0
  237. package/openapi/gen/models/trainingRunQuoteInputsValidation.ts +3 -0
  238. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOf.ts +9 -0
  239. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfFailure.ts +3 -0
  240. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfFailureAnyOf.ts +7 -0
  241. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfFailureAnyOfCode.ts +2 -0
  242. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReport.ts +3 -0
  243. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOf.ts +9 -0
  244. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfErrorsItem.ts +5 -0
  245. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfTokens.ts +10 -0
  246. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfTokensEstimatorVersion.ts +2 -0
  247. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfTokensTotal.ts +2 -0
  248. package/openapi/gen/models/trainingRunStatus.ts +2 -0
  249. package/openapi/gen/models/updateTrainingMetadataBody.ts +5 -0
  250. package/package.json +3 -3
  251. package/skills/catalog.json +19 -7
  252. package/skills/toloka-build/SKILL.md +4 -4
  253. package/skills/toloka-build/references/node-semantics.md +2 -2
  254. package/skills/toloka-build/references/workflow-and-cli.md +21 -3
  255. package/skills/toloka-report-issue/references/report-template.md +1 -1
  256. package/src/authoring/index.ts +10 -0
  257. package/src/cli/auth.ts +1 -1
  258. package/src/cli/auto-update.ts +1 -5
  259. package/src/cli/bin.ts +1 -1
  260. package/src/cli/check.ts +91 -30
  261. package/src/cli/cost.ts +8 -2
  262. package/src/cli/models.ts +107 -2
  263. package/src/cli/program.ts +271 -2
  264. package/src/cli/project-context.ts +55 -11
  265. package/src/cli/project.ts +55 -11
  266. package/src/cli/secrets.ts +4 -4
  267. package/src/cli/trainings.ts +627 -0
  268. package/src/cli/version.ts +68 -0
  269. package/src/client.ts +164 -30
  270. package/src/index.ts +4 -0
  271. package/openapi/gen/models/createDatasetExportBodyOneOf.ts +0 -6
  272. package/openapi/gen/models/createDatasetExportBodyOneOfFormat.ts +0 -2
  273. package/openapi/gen/models/createDatasetExportBodyOneOfThree.ts +0 -10
  274. package/openapi/gen/models/createDatasetExportBodyOneOfThreeContract.ts +0 -2
  275. package/openapi/gen/models/createDatasetExportBodyOneOfThreeFormat.ts +0 -2
  276. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilter.ts +0 -9
  277. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItem.ts +0 -6
  278. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItemSourcesItem.ts +0 -4
  279. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItemSourcesItemOneOf.ts +0 -5
  280. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +0 -5
  281. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItem.ts +0 -12
  282. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemOperator.ts +0 -2
  283. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemSourcesItem.ts +0 -4
  284. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemSourcesItemOneOf.ts +0 -5
  285. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +0 -5
  286. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemValue.ts +0 -2
package/src/cli/check.ts CHANGED
@@ -114,6 +114,18 @@ export type CheckProjectResult = {
114
114
  readonly source?: ProjectSource;
115
115
  readonly output: string;
116
116
  };
117
+
118
+ export type FreshCheckFailurePhase = "spawn" | "execute" | "read_result" | "parse_result";
119
+
120
+ export class FreshCheckProcessError extends Error {
121
+ readonly phase: FreshCheckFailurePhase;
122
+
123
+ constructor(phase: FreshCheckFailurePhase, message: string, options?: ErrorOptions) {
124
+ super(message, options);
125
+ this.name = "FreshCheckProcessError";
126
+ this.phase = phase;
127
+ }
128
+ }
117
129
  const MAX_DIAGNOSTIC_CHARS = 5_000;
118
130
  const MAX_TOOL_OUTPUT_BYTES = 64 * 1024;
119
131
  export const CHECK_RESULT_FILE_ENV = "TOLOKA_INTERNAL_CHECK_RESULT_FILE";
@@ -865,44 +877,93 @@ const parseFreshCheckResult = (value: unknown, json: boolean): CheckProjectResul
865
877
  output: json ? JSON.stringify({ exitCode, results }) : formatCheckResults(results),
866
878
  };
867
879
  };
880
+
881
+ const checkProcessOutput = (run: ToolRunResult): string =>
882
+ [run.stderr, run.stdout].filter(Boolean).join("\n");
883
+
884
+ export const readFreshCheckResult = async (
885
+ run: ToolRunResult,
886
+ readResult: () => Promise<string>,
887
+ json = false,
888
+ ): Promise<CheckProjectResult> => {
889
+ let raw: string;
890
+ try {
891
+ raw = await readResult();
892
+ } catch (error) {
893
+ if (run.exitCode !== 0) {
894
+ const output = checkProcessOutput(run);
895
+ throw new FreshCheckProcessError(
896
+ "execute",
897
+ output.length === 0
898
+ ? `Local check process exited ${run.exitCode} before producing results`
899
+ : `Local check process failed before producing results:\n${output}`,
900
+ { cause: error },
901
+ );
902
+ }
903
+ throw new FreshCheckProcessError(
904
+ "read_result",
905
+ "Local check process completed without producing a result file",
906
+ { cause: error },
907
+ );
908
+ }
909
+
910
+ let parsed: unknown;
911
+ try {
912
+ parsed = JSON.parse(raw);
913
+ } catch (error) {
914
+ throw new FreshCheckProcessError("parse_result", "Local check process returned invalid JSON", {
915
+ cause: error,
916
+ });
917
+ }
918
+
919
+ try {
920
+ return parseFreshCheckResult(parsed, json);
921
+ } catch (error) {
922
+ throw new FreshCheckProcessError(
923
+ "parse_result",
924
+ `Local check process returned an invalid result: ${error instanceof Error ? error.message : String(error)}`,
925
+ { cause: error },
926
+ );
927
+ }
928
+ };
868
929
  export const runFreshCheck = async (options: CheckProjectOptions): Promise<CheckProjectResult> => {
869
930
  const entry = resolveCliEntry();
870
931
  const resultDirectory = await mkdtemp(join(tmpdir(), "toloka-check-watch-result-"));
871
932
  const resultPath = join(resultDirectory, "result.json");
872
- let run: ToolRunResult | undefined;
873
933
  try {
874
- run = await runModule(
875
- options.sourceRoot,
876
- entry,
877
- [
878
- "--source-root",
934
+ let run: ToolRunResult;
935
+ try {
936
+ run = await runModule(
879
937
  options.sourceRoot,
880
- "check",
881
- ...(options.pipeline === undefined ? [] : [options.pipeline]),
882
- ...(options.node === undefined ? [] : ["--node", options.node]),
883
- "--json",
884
- ],
885
- {
886
- ...(process.env.PATH === undefined ? {} : { PATH: process.env.PATH }),
887
- ...(options.environment ?? process.env),
888
- [CHECK_RESULT_FILE_ENV]: resultPath,
889
- },
890
- options.signal,
891
- "bun",
892
- );
893
- return parseFreshCheckResult(
894
- JSON.parse(await readFile(resultPath, "utf8")),
938
+ entry,
939
+ [
940
+ "--source-root",
941
+ options.sourceRoot,
942
+ "check",
943
+ ...(options.pipeline === undefined ? [] : [options.pipeline]),
944
+ ...(options.node === undefined ? [] : ["--node", options.node]),
945
+ "--json",
946
+ ],
947
+ {
948
+ ...(process.env.PATH === undefined ? {} : { PATH: process.env.PATH }),
949
+ ...(options.environment ?? process.env),
950
+ [CHECK_RESULT_FILE_ENV]: resultPath,
951
+ },
952
+ options.signal,
953
+ "bun",
954
+ );
955
+ } catch (error) {
956
+ throw new FreshCheckProcessError(
957
+ "spawn",
958
+ `Unable to start the local check process: ${error instanceof Error ? error.message : String(error)}`,
959
+ { cause: error },
960
+ );
961
+ }
962
+ return await readFreshCheckResult(
963
+ run,
964
+ async () => readFile(resultPath, "utf8"),
895
965
  options.json === true,
896
966
  );
897
- } catch (error) {
898
- const detail = [
899
- run?.stderr,
900
- run?.stdout,
901
- error instanceof Error ? error.message : String(error),
902
- ]
903
- .filter(Boolean)
904
- .join("\n");
905
- throw new Error(`Fresh check process returned unreadable output: ${detail}`, { cause: error });
906
967
  } finally {
907
968
  await rm(resultDirectory, { recursive: true, force: true });
908
969
  }
package/src/cli/cost.ts CHANGED
@@ -80,9 +80,15 @@ const collectNodeRows = (
80
80
  };
81
81
 
82
82
  const collectTotalRows = (total: PipelineCostEstimate["total"]): TableRow[] => {
83
- const totals: TableRow[] = [["Total", total.expected, total.worstCase]];
83
+ const totals: TableRow[] =
84
+ total.expected === total.worstCase
85
+ ? [["Run cost", total.expected, ""]]
86
+ : [
87
+ ["Expected run cost", total.expected, ""],
88
+ ["Maximum run cost", "", total.worstCase],
89
+ ];
84
90
  if (total.bestCase != null) {
85
- totals.push(["Best case", total.bestCase, ""]);
91
+ totals.push(["Best case", total.bestCase, "N/A"]);
86
92
  }
87
93
  if (total.perItemExpected != null) {
88
94
  totals.push(["Per item", total.perItemExpected, total.perItemWorstCase ?? ""]);
package/src/cli/models.ts CHANGED
@@ -1,3 +1,10 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { mkdir, open, realpath, rename, rm } from "node:fs/promises";
4
+ import { isAbsolute, relative, resolve, sep } from "node:path";
5
+ import { Readable, Transform } from "node:stream";
6
+ import { pipeline } from "node:stream/promises";
7
+
1
8
  import { assert } from "es-toolkit";
2
9
 
3
10
  import type { BaseModel, BaseModelId, Model, ModelVersion, PotatoClient } from "../client";
@@ -73,6 +80,29 @@ const resolveModel = async (
73
80
  return matches[0]!;
74
81
  };
75
82
 
83
+ const resolveModelVersion = async (
84
+ client: ModelApi,
85
+ projectId: string | undefined,
86
+ nameOrId: string,
87
+ ): Promise<ModelVersion> => {
88
+ if (nameOrId.startsWith("mdv.")) return client.models.getVersion({ modelVersionId: nameOrId });
89
+ const separator = nameOrId.lastIndexOf("@");
90
+ assert(separator > 0, `Model Version ${nameOrId} was not found. Use mdv.<id> or Model@name.`);
91
+ assert(projectId, "Select a project to resolve Model Version names.");
92
+ const model = await resolveModel(client, projectId, nameOrId.slice(0, separator));
93
+ const versionName = nameOrId.slice(separator + 1);
94
+ const matches: ModelVersion[] = [];
95
+ for await (const version of client.models.listAllVersions({
96
+ projectId,
97
+ modelId: model.id,
98
+ limit: 100,
99
+ })) {
100
+ if (version.name === versionName) matches.push(version);
101
+ }
102
+ assert(matches.length === 1, `Model Version ${nameOrId} was not found or is ambiguous.`);
103
+ return matches[0]!;
104
+ };
105
+
76
106
  export const listBaseModels = async (
77
107
  client: ModelApi,
78
108
  input: { json: boolean },
@@ -155,8 +185,13 @@ export const listModelVersions = async (
155
185
  versions.length === 0
156
186
  ? "No Model Versions found."
157
187
  : formatTable([
158
- ["VERSION", "ID", "CREATED AT"],
159
- ...versions.map((version) => [version.version, version.id, version.createdAt]),
188
+ ["REVISION", "NAME", "ID", "CREATED AT"],
189
+ ...versions.map((version) => [
190
+ String(version.revision),
191
+ version.name,
192
+ version.id,
193
+ version.createdAt,
194
+ ]),
160
195
  ]),
161
196
  );
162
197
  };
@@ -186,3 +221,73 @@ export const archiveModel = async (
186
221
  const archived = await client.models.archive({ projectId: input.projectId, modelId: model.id });
187
222
  writeOutput(io, input.json, archived, `Archived Model ${archived.id}.`);
188
223
  };
224
+
225
+ export const downloadModelVersion = async (
226
+ client: ModelApi,
227
+ input: { projectId?: string; modelVersionId: string; out: string },
228
+ io: ModelIo,
229
+ ): Promise<void> => {
230
+ const version = await resolveModelVersion(client, input.projectId, input.modelVersionId);
231
+ const descriptor = await client.models.getVersionContent({
232
+ modelVersionId: version.id,
233
+ });
234
+ const root = resolve(input.out);
235
+ await mkdir(root, { recursive: true });
236
+ const realRoot = await realpath(root);
237
+
238
+ for (const file of descriptor.files) {
239
+ const target = resolve(root, file.path);
240
+ const relativeTarget = relative(root, target);
241
+ assert(
242
+ relativeTarget !== "" &&
243
+ relativeTarget !== ".." &&
244
+ !relativeTarget.startsWith(`..${sep}`) &&
245
+ !isAbsolute(relativeTarget),
246
+ `Invalid Model Version file path: ${file.path}`,
247
+ );
248
+ let parent = root;
249
+ for (const segment of file.path.split("/").slice(0, -1)) {
250
+ parent = resolve(parent, segment);
251
+ await mkdir(parent, { recursive: true });
252
+ const realParent = await realpath(parent);
253
+ assert(
254
+ realParent === realRoot || realParent.startsWith(`${realRoot}${sep}`),
255
+ `Invalid Model Version file path: ${file.path}`,
256
+ );
257
+ }
258
+ const response = await fetch(file.url, { redirect: "error" });
259
+ assert(response.ok && response.body, `Failed to download Model Version file ${file.path}.`);
260
+ const hash = createHash("sha256");
261
+ let byteSize = 0;
262
+ const verify = new Transform({
263
+ transform(chunk: Buffer, _encoding, callback) {
264
+ byteSize += chunk.byteLength;
265
+ hash.update(chunk);
266
+ callback(null, chunk);
267
+ },
268
+ });
269
+ const temporary = `${target}.${randomUUID()}.tmp`;
270
+ try {
271
+ const handle = await open(
272
+ temporary,
273
+ constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW,
274
+ 0o600,
275
+ );
276
+ await pipeline(Readable.from(response.body), verify, handle.createWriteStream());
277
+ assert(
278
+ byteSize === file.byteSize,
279
+ `Downloaded Model Version file ${file.path} has an unexpected size.`,
280
+ );
281
+ assert(
282
+ hash.digest("hex") === file.sha256,
283
+ `Downloaded Model Version file ${file.path} has an invalid hash.`,
284
+ );
285
+ await rename(temporary, target);
286
+ } catch (error) {
287
+ await rm(temporary, { force: true });
288
+ throw error;
289
+ }
290
+ }
291
+
292
+ io.stdout(`Downloaded Model Version ${descriptor.id} revision ${descriptor.revision} to ${root}`);
293
+ };
@@ -48,6 +48,7 @@ import {
48
48
  import {
49
49
  archiveModel,
50
50
  createModel,
51
+ downloadModelVersion,
51
52
  getBaseModel,
52
53
  getModel,
53
54
  listBaseModels,
@@ -64,6 +65,7 @@ import {
64
65
  removeProject,
65
66
  resolveProjectContext,
66
67
  switchProject,
68
+ untrackProjectResource,
67
69
  } from "./project-context";
68
70
  import { estimatePipelineCost } from "./cost";
69
71
  import { submitIssueReport } from "./report";
@@ -78,9 +80,24 @@ import {
78
80
  pipelineRunStatus,
79
81
  startPipelineRun,
80
82
  } from "./runs";
83
+ import {
84
+ cancelTrainingRun,
85
+ createTraining,
86
+ createTrainingRun,
87
+ estimateTrainingCost,
88
+ getTraining,
89
+ getTrainingRun,
90
+ readTrainingRunLogs,
91
+ listTrainingRuns,
92
+ resumeTrainingRun,
93
+ listTrainings,
94
+ updateTraining,
95
+ } from "./trainings";
96
+ import type { TrainingDraftOptions } from "./trainings";
81
97
 
82
98
  import type { RunOutcome } from "./runs";
83
99
  import { skillInstallCommand, skillListCommand, skillSearchCommand } from "./skill";
100
+ import { cliVersionInfo } from "./version";
84
101
  import { findSourceRoot } from "./source";
85
102
 
86
103
  export type CliIo = {
@@ -127,6 +144,55 @@ const positiveInteger = (raw: string): number => {
127
144
  return value;
128
145
  };
129
146
 
147
+ const nonNegativeInteger = (raw: string): number => {
148
+ const value = Number(raw);
149
+ if (!Number.isInteger(value) || value < 0)
150
+ throw new InvalidArgumentError("Expected a non-negative integer.");
151
+ return value;
152
+ };
153
+
154
+ const trainingMethod = (raw: string): "sft" | "gisting" => {
155
+ if (raw !== "sft" && raw !== "gisting") {
156
+ throw new InvalidArgumentError('Expected training method "sft" or "gisting".');
157
+ }
158
+ return raw;
159
+ };
160
+
161
+ const trainingRegime = (raw: string): "low" | "medium" | "high" => {
162
+ if (raw !== "low" && raw !== "medium" && raw !== "high") {
163
+ throw new InvalidArgumentError('Expected regime "low", "medium", or "high".');
164
+ }
165
+ return raw;
166
+ };
167
+
168
+ type RawTrainingDraftOptions = {
169
+ method?: TrainingDraftOptions["method"];
170
+ baseModel?: TrainingDraftOptions["baseModelId"];
171
+ modelVersion?: string;
172
+ dataset?: string;
173
+ validationDataset?: string;
174
+ trainFilter?: string;
175
+ validationFilter?: string;
176
+ regime?: TrainingDraftOptions["regime"];
177
+ epochs?: number;
178
+ evalSteps?: number;
179
+ promptFile?: string;
180
+ };
181
+
182
+ const trainingDraftOptions = (options: RawTrainingDraftOptions): TrainingDraftOptions => ({
183
+ method: options.method,
184
+ baseModelId: options.baseModel,
185
+ modelVersionId: options.modelVersion,
186
+ datasetId: options.dataset,
187
+ validationDatasetId: options.validationDataset,
188
+ trainingFilter: options.trainFilter,
189
+ validationFilter: options.validationFilter,
190
+ regime: options.regime,
191
+ epochs: options.epochs,
192
+ evalSteps: options.evalSteps,
193
+ promptFilePath: options.promptFile,
194
+ });
195
+
130
196
  const exitCodeForOutcome = (outcome: RunOutcome): number => {
131
197
  if (outcome === "failed") return 1;
132
198
  if (outcome === "timedOut") return 2;
@@ -242,7 +308,7 @@ export function createProgram(context: ProgramContext): CreatedProgram {
242
308
 
243
309
  program
244
310
  .description(
245
- "Preview. Build and operate Toloka pipeline projects from TypeScript source. The public API may change.",
311
+ "Beta. Build and operate Toloka pipeline projects from TypeScript source. The public API may change before general availability.",
246
312
  )
247
313
  .version(SDK_VERSION, "-v, --version", "output the current version")
248
314
  .option(
@@ -282,10 +348,14 @@ export function createProgram(context: ProgramContext): CreatedProgram {
282
348
  warnedAboutStaleSkills = true;
283
349
  context.io.stderr(warning);
284
350
  });
351
+
285
352
  program
286
353
  .command("version")
354
+ .option("--json", "print version and build provenance as JSON", false)
287
355
  .description("print the current CLI version")
288
- .action(() => context.io.stdout(SDK_VERSION));
356
+ .action((options: { json: boolean }) =>
357
+ context.io.stdout(options.json ? JSON.stringify(cliVersionInfo()) : SDK_VERSION),
358
+ );
289
359
 
290
360
  const config = program.command("config").description("read and write machine CLI settings");
291
361
  config
@@ -472,6 +542,26 @@ export function createProgram(context: ProgramContext): CreatedProgram {
472
542
  io: context.io,
473
543
  });
474
544
  });
545
+ project
546
+ .command("untrack")
547
+ .argument("<type>", "pipeline or dataset")
548
+ .argument("<name>", "tracked resource name")
549
+ .option("--confirm", "confirm untracking in a non-interactive environment", false)
550
+ .description("remove a pipeline or dataset from local tracking without deleting it")
551
+ .action(async (type: string, name: string, options: { confirm: boolean }) => {
552
+ assert(
553
+ type === "pipeline" || type === "dataset",
554
+ "Resource type must be pipeline or dataset.",
555
+ );
556
+ const sourceRoot = await resolveSourceRoot(globals(), context.io);
557
+ await untrackProjectResource({
558
+ sourceRoot,
559
+ type,
560
+ name,
561
+ confirm: options.confirm,
562
+ io: context.io,
563
+ });
564
+ });
475
565
  project
476
566
  .command("create")
477
567
  .argument("[alias]", "local name for the new project")
@@ -772,6 +862,185 @@ export function createProgram(context: ProgramContext): CreatedProgram {
772
862
  await archiveModel(client, { projectId, nameOrId, json: options.json }, context.io);
773
863
  });
774
864
 
865
+ const modelVersion = model.command("version").description("manage one immutable Model Version");
866
+ modelVersion
867
+ .command("download")
868
+ .argument("<model-version>", "Model Version ID or Model@name")
869
+ .requiredOption("--out <directory>", "output directory")
870
+ .description("download and verify Model Version content")
871
+ .action(async (modelVersionId: string, options: { out: string }) => {
872
+ const { client, projectId } = await resolveContext(globals(), context);
873
+ await downloadModelVersion(
874
+ client,
875
+ { projectId, modelVersionId, out: options.out },
876
+ context.io,
877
+ );
878
+ });
879
+
880
+ const training = program.command("training").description("manage project Training drafts");
881
+ training
882
+ .command("list")
883
+ .option("--json", "print JSON", false)
884
+ .description("list active Trainings owned by the selected project")
885
+ .action(async (options: { json: boolean }) => {
886
+ const { client, projectId } = await resolveContext(globals(), context);
887
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
888
+ await listTrainings(client, { projectId, json: options.json }, context.io);
889
+ });
890
+ training
891
+ .command("get")
892
+ .argument("<name-or-id>", "Training name or ID")
893
+ .option("--json", "print JSON", false)
894
+ .description("show one Training draft")
895
+ .action(async (nameOrId: string, options: { json: boolean }) => {
896
+ const { client, projectId } = await resolveContext(globals(), context);
897
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
898
+ await getTraining(client, { projectId, nameOrId, json: options.json }, context.io);
899
+ });
900
+ training
901
+ .command("create")
902
+ .argument("<name>", "new Training name")
903
+ .option("--method <method>", "Training method", trainingMethod, "sft")
904
+ .option("--base-model <id>", "catalog Base Model source", parseBaseModelId)
905
+ .option("--model-version <id>", "exact Model Version source")
906
+ .requiredOption("--dataset <id>", "required training Dataset ID")
907
+ .option("--validation-dataset <id>", "optional validation Dataset ID")
908
+ .option("--train-filter <field=value>", "training Dataset field equality filter")
909
+ .option("--validation-filter <field=value>", "validation Dataset field equality filter")
910
+ .option("--regime <regime>", "Python training regime", trainingRegime)
911
+ .option("--epochs <count>", "training epochs", nonNegativeInteger)
912
+ .option("--eval-steps <count>", "SFT eval steps", positiveInteger)
913
+ .option("--prompt-file <path>", "gisting prompt text file")
914
+ .option("--json", "print JSON", false)
915
+ .description("create a normalized Training draft")
916
+ .action(async (name: string, options: RawTrainingDraftOptions & { json: boolean }) => {
917
+ const { client, projectId } = await resolveContext(globals(), context);
918
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
919
+ await createTraining(
920
+ client,
921
+ {
922
+ ...trainingDraftOptions(options),
923
+ projectId,
924
+ name,
925
+ json: options.json,
926
+ },
927
+ context.io,
928
+ );
929
+ });
930
+ training
931
+ .command("update")
932
+ .argument("<name-or-id>", "Training name or ID")
933
+ .option("--base-model <id>", "catalog Base Model source", parseBaseModelId)
934
+ .option("--model-version <id>", "exact Model Version source")
935
+ .option("--dataset <id>", "required training Dataset ID")
936
+ .option("--validation-dataset <id>", "replacement validation Dataset ID")
937
+ .option("--train-filter <field=value>", "replacement training Dataset field equality filter")
938
+ .option("--validation-filter <field=value>", "replacement validation Dataset field equality filter")
939
+ .option("--regime <regime>", "Python training regime", trainingRegime)
940
+ .option("--epochs <count>", "training epochs", nonNegativeInteger)
941
+ .option("--eval-steps <count>", "SFT eval steps", positiveInteger)
942
+ .option("--prompt-file <path>", "replacement gisting prompt text file")
943
+ .option("--json", "print JSON", false)
944
+ .description("replace the complete Training draft")
945
+ .action(async (nameOrId: string, options: RawTrainingDraftOptions & { json: boolean }) => {
946
+ const { client, projectId } = await resolveContext(globals(), context);
947
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
948
+ await updateTraining(
949
+ client,
950
+ {
951
+ ...trainingDraftOptions(options),
952
+ projectId,
953
+ nameOrId,
954
+ json: options.json,
955
+ },
956
+ context.io,
957
+ );
958
+ });
959
+ training
960
+ .command("cost")
961
+ .argument("<name-or-id>", "Training name or ID")
962
+ .option("--idempotency-key <key>", "reuse one Cost Estimate input preparation")
963
+ .option("--json", "print JSON", false)
964
+ .description("validate Training inputs and calculate the maximum charge")
965
+ .action(async (nameOrId: string, options: { idempotencyKey?: string; json: boolean }) => {
966
+ const { client, projectId } = await resolveContext(globals(), context);
967
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
968
+ await estimateTrainingCost(
969
+ client,
970
+ { projectId, nameOrId, idempotencyKey: options.idempotencyKey, json: options.json },
971
+ context.io,
972
+ );
973
+ });
974
+ training
975
+ .command("run")
976
+ .argument("<name-or-id>", "Training name or ID")
977
+ .requiredOption("--estimate-file <path>", "ready Training Cost Estimate JSON")
978
+ .requiredOption("--version-name <name>", "unique Model Version name for this run")
979
+ .option("--idempotency-key <key>", "reuse one Training Run creation")
980
+ .option("--json", "print JSON", false)
981
+ .description("create one queued Training Run from a ready Cost Estimate")
982
+ .action(
983
+ async (
984
+ nameOrId: string,
985
+ options: {
986
+ estimateFile: string;
987
+ versionName: string;
988
+ idempotencyKey?: string;
989
+ json: boolean;
990
+ },
991
+ ) => {
992
+ const { client, projectId } = await resolveContext(globals(), context);
993
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
994
+ await createTrainingRun(client, { projectId, nameOrId, ...options }, context.io);
995
+ },
996
+ );
997
+ training
998
+ .command("runs")
999
+ .argument("<name-or-id>", "Training name or ID")
1000
+ .option("--json", "print JSON", false)
1001
+ .description("list Training Run history")
1002
+ .action(async (nameOrId: string, options: { json: boolean }) => {
1003
+ const { client, projectId } = await resolveContext(globals(), context);
1004
+ assert(projectId, MISSING_PROJECT_ID_MESSAGE);
1005
+ await listTrainingRuns(client, { projectId, nameOrId, json: options.json }, context.io);
1006
+ });
1007
+ training
1008
+ .command("status")
1009
+ .argument("<training-run-id>", "Training Run ID")
1010
+ .option("--json", "print JSON", false)
1011
+ .description("show one Training Run")
1012
+ .action(async (trainingRunId: string, options: { json: boolean }) => {
1013
+ const { client } = await resolveContext(globals(), context);
1014
+ await getTrainingRun(client, { trainingRunId, json: options.json }, context.io);
1015
+ });
1016
+ training
1017
+ .command("resume")
1018
+ .argument("<training-run-id>", "Training Run ID")
1019
+ .option("--json", "print JSON", false)
1020
+ .description("resume a Training Run blocked on funds or payment")
1021
+ .action(async (trainingRunId: string, options: { json: boolean }) => {
1022
+ const { client } = await resolveContext(globals(), context);
1023
+ await resumeTrainingRun(client, { trainingRunId, json: options.json }, context.io);
1024
+ });
1025
+ training
1026
+ .command("cancel")
1027
+ .argument("<training-run-id>", "Training Run ID")
1028
+ .option("--json", "print JSON", false)
1029
+ .description("cancel a Training Run before provider work completes")
1030
+ .action(async (trainingRunId: string, options: { json: boolean }) => {
1031
+ const { client } = await resolveContext(globals(), context);
1032
+ await cancelTrainingRun(client, { trainingRunId, json: options.json }, context.io);
1033
+ });
1034
+ training
1035
+ .command("logs")
1036
+ .argument("<training-run-id>", "Training Run ID")
1037
+ .option("--follow", "wait for new log entries until complete", false)
1038
+ .description("read sanitized Training Run logs")
1039
+ .action(async (trainingRunId: string, options: { follow: boolean }) => {
1040
+ const { client } = await resolveContext(globals(), context);
1041
+ await readTrainingRunLogs(client, { trainingRunId, follow: options.follow }, context.io);
1042
+ });
1043
+
775
1044
  const dataset = program
776
1045
  .command("dataset")
777
1046
  .description("inspect and move dataset catalog and rows");