@toloka-platform/sdk 0.1.0 → 0.2.0-preview.2

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 (294) hide show
  1. package/README.md +2 -2
  2. package/dist/cli/toloka.js +138 -136
  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/cli-v2.md +1 -1
  7. package/docs/cli.md +3 -1
  8. package/docs/getting-started.md +1 -1
  9. package/docs/limitations.md +2 -2
  10. package/docs/testing.md +1 -1
  11. package/examples/face-image-collection/README.md +1 -1
  12. package/openapi/gen/api.ts +1482 -777
  13. package/openapi/gen/models/createDatasetExportBody.ts +5 -3
  14. package/openapi/gen/models/createDatasetExportBodyFormat.ts +2 -0
  15. package/openapi/gen/models/createProjectTrainingBody.ts +6 -0
  16. package/openapi/gen/models/createTrainingRunBody.ts +6 -0
  17. package/openapi/gen/models/datasetExportReportTokens.ts +4 -1
  18. package/openapi/gen/models/datasetExportReportTokensEstimatorVersion.ts +2 -0
  19. package/openapi/gen/models/datasetExportReportTokensTotal.ts +2 -0
  20. package/openapi/gen/models/estimateTrainingCostBody.ts +5 -0
  21. package/openapi/gen/models/exportJob.ts +2 -0
  22. package/openapi/gen/models/exportJobError.ts +3 -0
  23. package/openapi/gen/models/exportJobErrorAnyOf.ts +7 -0
  24. package/openapi/gen/models/exportJobErrorAnyOfCode.ts +2 -0
  25. package/openapi/gen/models/exportJobStatus.ts +1 -1
  26. package/openapi/gen/models/generationNodeSettingsAudienceAndPricingOneOfOneoneGenerationModelId.ts +1 -1
  27. package/openapi/gen/models/generationNodeSettingsQualityAssuranceOneOfFourLlmQaModelId.ts +1 -1
  28. package/openapi/gen/models/generationNodeSettingsQualityAssuranceOneOfLlmQaModelId.ts +1 -1
  29. package/openapi/gen/models/getTrainingRunLogsParams.ts +5 -0
  30. package/openapi/gen/models/gistingTrainingConfiguration.ts +13 -0
  31. package/openapi/gen/models/gistingTrainingConfigurationInput.ts +13 -0
  32. package/openapi/gen/models/gistingTrainingConfigurationInputRegime.ts +2 -0
  33. package/openapi/gen/models/gistingTrainingConfigurationRegime.ts +2 -0
  34. package/openapi/gen/models/index.ts +230 -16
  35. package/openapi/gen/models/listProjectTrainings200.ts +7 -0
  36. package/openapi/gen/models/listProjectTrainingsParams.ts +5 -0
  37. package/openapi/gen/models/listTrainingRuns200.ts +7 -0
  38. package/openapi/gen/models/listTrainingRunsParams.ts +5 -0
  39. package/openapi/gen/models/modelVersion.ts +6 -1
  40. package/openapi/gen/models/modelVersionContent.ts +4 -0
  41. package/openapi/gen/models/modelVersionContentDownload.ts +11 -0
  42. package/openapi/gen/models/modelVersionContentDownloadContent.ts +4 -0
  43. package/openapi/gen/models/modelVersionContentDownloadContentOneOf.ts +10 -0
  44. package/openapi/gen/models/modelVersionContentDownloadContentOneOfManifestItem.ts +8 -0
  45. package/openapi/gen/models/modelVersionContentDownloadContentOneOfManifestItemMediaType.ts +2 -0
  46. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNine.ts +8 -0
  47. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNineManifestItem.ts +8 -0
  48. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNineManifestItemMediaType.ts +2 -0
  49. package/openapi/gen/models/modelVersionContentDownloadContentOneOfNineRuntimeBase.ts +2 -0
  50. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParent.ts +4 -0
  51. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParentOneOf.ts +6 -0
  52. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParentOneOfBaseModelId.ts +2 -0
  53. package/openapi/gen/models/modelVersionContentDownloadContentOneOfParentOneOfThree.ts +5 -0
  54. package/openapi/gen/models/modelVersionContentDownloadContentOneOfRuntimeBase.ts +2 -0
  55. package/openapi/gen/models/modelVersionContentDownloadFilesItem.ts +9 -0
  56. package/openapi/gen/models/modelVersionContentDownloadFilesItemMediaType.ts +2 -0
  57. package/openapi/gen/models/modelVersionContentOneOf.ts +10 -0
  58. package/openapi/gen/models/modelVersionContentOneOfManifestItem.ts +8 -0
  59. package/openapi/gen/models/modelVersionContentOneOfManifestItemMediaType.ts +2 -0
  60. package/openapi/gen/models/modelVersionContentOneOfNine.ts +8 -0
  61. package/openapi/gen/models/modelVersionContentOneOfNineManifestItem.ts +8 -0
  62. package/openapi/gen/models/modelVersionContentOneOfNineManifestItemMediaType.ts +2 -0
  63. package/openapi/gen/models/modelVersionContentOneOfNineRuntimeBase.ts +2 -0
  64. package/openapi/gen/models/modelVersionContentOneOfParent.ts +4 -0
  65. package/openapi/gen/models/modelVersionContentOneOfParentOneOf.ts +6 -0
  66. package/openapi/gen/models/modelVersionContentOneOfParentOneOfBaseModelId.ts +2 -0
  67. package/openapi/gen/models/modelVersionContentOneOfParentOneOfThree.ts +5 -0
  68. package/openapi/gen/models/modelVersionContentOneOfRuntimeBase.ts +2 -0
  69. package/openapi/gen/models/modelVersionProducer.ts +5 -0
  70. package/openapi/gen/models/pipelineGraphSnapshotGraphNodesItemOneOfOnefoursevenSettingsQualityAssuranceOneOfLlmQaModelId.ts +1 -1
  71. package/openapi/gen/models/pipelineGraphSnapshotGraphNodesItemOneOfThreeoneSettingsAudienceAndPricingOneOfOneoneGenerationModelId.ts +1 -1
  72. package/openapi/gen/models/pipelineGraphSnapshotGraphNodesItemOneOfThreeoneSettingsQualityAssuranceOneOfFourLlmQaModelId.ts +1 -1
  73. package/openapi/gen/models/pipelineGraphSnapshotGraphNodesItemOneOfThreeoneSettingsQualityAssuranceOneOfLlmQaModelId.ts +1 -1
  74. package/openapi/gen/models/prepareTrainingCostEstimateInputsBody.ts +2 -0
  75. package/openapi/gen/models/quorumNodeSettingsQualityAssuranceOneOfLlmQaModelId.ts +1 -1
  76. package/openapi/gen/models/replaceTrainingConfigurationBody.ts +5 -0
  77. package/openapi/gen/models/sftTrainingConfiguration.ts +13 -0
  78. package/openapi/gen/models/sftTrainingConfigurationInput.ts +13 -0
  79. package/openapi/gen/models/sftTrainingConfigurationInputRegime.ts +2 -0
  80. package/openapi/gen/models/sftTrainingConfigurationRegime.ts +2 -0
  81. package/openapi/gen/models/training.ts +16 -0
  82. package/openapi/gen/models/trainingArchivedAt.ts +2 -0
  83. package/openapi/gen/models/trainingConfiguration.ts +4 -0
  84. package/openapi/gen/models/trainingConfigurationInput.ts +4 -0
  85. package/openapi/gen/models/trainingCostEstimate.ts +4 -0
  86. package/openapi/gen/models/trainingCostEstimateInputSet.ts +12 -0
  87. package/openapi/gen/models/trainingCostEstimateInputSetExports.ts +6 -0
  88. package/openapi/gen/models/trainingCostEstimateInputSetExportsValidation.ts +2 -0
  89. package/openapi/gen/models/trainingCostEstimateInputSetId.ts +2 -0
  90. package/openapi/gen/models/trainingCostEstimateOneOf.ts +16 -0
  91. package/openapi/gen/models/trainingCostEstimateOneOfInputs.ts +7 -0
  92. package/openapi/gen/models/trainingCostEstimateOneOfInputsTraining.ts +9 -0
  93. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingFailure.ts +3 -0
  94. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingFailureAnyOf.ts +7 -0
  95. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingFailureAnyOfCode.ts +2 -0
  96. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReport.ts +3 -0
  97. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOf.ts +9 -0
  98. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfErrorsItem.ts +5 -0
  99. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfTokens.ts +10 -0
  100. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfTokensEstimatorVersion.ts +2 -0
  101. package/openapi/gen/models/trainingCostEstimateOneOfInputsTrainingReportAnyOfTokensTotal.ts +2 -0
  102. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidation.ts +3 -0
  103. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOf.ts +9 -0
  104. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfFailure.ts +3 -0
  105. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfFailureAnyOf.ts +7 -0
  106. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfFailureAnyOfCode.ts +2 -0
  107. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReport.ts +3 -0
  108. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOf.ts +9 -0
  109. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfErrorsItem.ts +5 -0
  110. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfTokens.ts +10 -0
  111. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfTokensEstimatorVersion.ts +2 -0
  112. package/openapi/gen/models/trainingCostEstimateOneOfInputsValidationAnyOfReportAnyOfTokensTotal.ts +2 -0
  113. package/openapi/gen/models/trainingCostEstimateOneOfIssuesItem.ts +8 -0
  114. package/openapi/gen/models/trainingCostEstimateOneOfIssuesItemCode.ts +2 -0
  115. package/openapi/gen/models/trainingCostEstimateOneOfIssuesItemPurpose.ts +2 -0
  116. package/openapi/gen/models/trainingCostEstimateOneOfTwoseven.ts +23 -0
  117. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenBudget.ts +9 -0
  118. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputs.ts +7 -0
  119. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTraining.ts +9 -0
  120. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingFailure.ts +3 -0
  121. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingFailureAnyOf.ts +7 -0
  122. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingFailureAnyOfCode.ts +2 -0
  123. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReport.ts +3 -0
  124. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOf.ts +9 -0
  125. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfErrorsItem.ts +5 -0
  126. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfTokens.ts +10 -0
  127. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfTokensEstimatorVersion.ts +2 -0
  128. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsTrainingReportAnyOfTokensTotal.ts +2 -0
  129. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidation.ts +3 -0
  130. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOf.ts +9 -0
  131. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfFailure.ts +3 -0
  132. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfFailureAnyOf.ts +7 -0
  133. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfFailureAnyOfCode.ts +2 -0
  134. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReport.ts +3 -0
  135. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOf.ts +9 -0
  136. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfErrorsItem.ts +5 -0
  137. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfTokens.ts +10 -0
  138. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfTokensEstimatorVersion.ts +2 -0
  139. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenInputsValidationAnyOfReportAnyOfTokensTotal.ts +2 -0
  140. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenIssuesItem.ts +8 -0
  141. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenIssuesItemCode.ts +2 -0
  142. package/openapi/gen/models/trainingCostEstimateOneOfTwosevenIssuesItemPurpose.ts +2 -0
  143. package/openapi/gen/models/trainingDatasetItemFilter.ts +8 -0
  144. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItem.ts +6 -0
  145. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItemSourcesItem.ts +4 -0
  146. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItemSourcesItemOneOf.ts +5 -0
  147. package/openapi/gen/models/trainingDatasetItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  148. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItem.ts +12 -0
  149. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemOperator.ts +2 -0
  150. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemSourcesItem.ts +4 -0
  151. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemSourcesItemOneOf.ts +5 -0
  152. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  153. package/openapi/gen/models/trainingDatasetItemFilterFieldValuesItemValue.ts +2 -0
  154. package/openapi/gen/models/trainingDatasetItemFilterInput.ts +8 -0
  155. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItem.ts +6 -0
  156. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItemSourcesItem.ts +4 -0
  157. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItemSourcesItemOneOf.ts +5 -0
  158. package/openapi/gen/models/trainingDatasetItemFilterInputFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  159. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItem.ts +12 -0
  160. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemOperator.ts +2 -0
  161. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemSourcesItem.ts +4 -0
  162. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemSourcesItemOneOf.ts +5 -0
  163. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  164. package/openapi/gen/models/trainingDatasetItemFilterInputFieldValuesItemValue.ts +2 -0
  165. package/openapi/gen/models/trainingDatasetSelection.ts +6 -0
  166. package/openapi/gen/models/trainingDatasetSelectionInput.ts +6 -0
  167. package/openapi/gen/models/trainingId.ts +2 -0
  168. package/openapi/gen/models/trainingModelId.ts +3 -0
  169. package/openapi/gen/models/trainingModelSource.ts +4 -0
  170. package/openapi/gen/models/trainingModelSourceOneOf.ts +6 -0
  171. package/openapi/gen/models/trainingModelSourceOneOfBaseModelId.ts +2 -0
  172. package/openapi/gen/models/trainingModelSourceOneOfThree.ts +5 -0
  173. package/openapi/gen/models/trainingRun.ts +39 -0
  174. package/openapi/gen/models/trainingRunBillingStatus.ts +2 -0
  175. package/openapi/gen/models/trainingRunBlockedReason.ts +2 -0
  176. package/openapi/gen/models/trainingRunChargedAmount.ts +2 -0
  177. package/openapi/gen/models/trainingRunError.ts +3 -0
  178. package/openapi/gen/models/trainingRunErrorAnyOf.ts +7 -0
  179. package/openapi/gen/models/trainingRunErrorAnyOfCode.ts +2 -0
  180. package/openapi/gen/models/trainingRunId.ts +2 -0
  181. package/openapi/gen/models/trainingRunInputs.ts +3 -0
  182. package/openapi/gen/models/trainingRunInputsAnyOf.ts +7 -0
  183. package/openapi/gen/models/trainingRunInputsAnyOfTraining.ts +15 -0
  184. package/openapi/gen/models/trainingRunInputsAnyOfTrainingContract.ts +2 -0
  185. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilter.ts +9 -0
  186. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItem.ts +6 -0
  187. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItemSourcesItem.ts +4 -0
  188. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItemSourcesItemOneOf.ts +5 -0
  189. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  190. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItem.ts +12 -0
  191. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemOperator.ts +2 -0
  192. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemSourcesItem.ts +4 -0
  193. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemSourcesItemOneOf.ts +5 -0
  194. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  195. package/openapi/gen/models/trainingRunInputsAnyOfTrainingItemFilterFieldValuesItemValue.ts +2 -0
  196. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReport.ts +9 -0
  197. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportErrorsItem.ts +5 -0
  198. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportTokens.ts +10 -0
  199. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportTokensEstimatorVersion.ts +2 -0
  200. package/openapi/gen/models/trainingRunInputsAnyOfTrainingReportTokensTotal.ts +2 -0
  201. package/openapi/gen/models/trainingRunInputsAnyOfValidation.ts +3 -0
  202. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOf.ts +15 -0
  203. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfContract.ts +2 -0
  204. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilter.ts +9 -0
  205. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItem.ts +6 -0
  206. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItemSourcesItem.ts +4 -0
  207. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItemSourcesItemOneOf.ts +5 -0
  208. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +5 -0
  209. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItem.ts +12 -0
  210. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemOperator.ts +2 -0
  211. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemSourcesItem.ts +4 -0
  212. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemSourcesItemOneOf.ts +5 -0
  213. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +5 -0
  214. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfItemFilterFieldValuesItemValue.ts +2 -0
  215. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReport.ts +9 -0
  216. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportErrorsItem.ts +5 -0
  217. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportTokens.ts +10 -0
  218. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportTokensEstimatorVersion.ts +2 -0
  219. package/openapi/gen/models/trainingRunInputsAnyOfValidationAnyOfReportTokensTotal.ts +2 -0
  220. package/openapi/gen/models/trainingRunLogs.ts +9 -0
  221. package/openapi/gen/models/trainingRunLogsEntriesItem.ts +7 -0
  222. package/openapi/gen/models/trainingRunLogsEntriesItemLevel.ts +2 -0
  223. package/openapi/gen/models/trainingRunLogsNextCursor.ts +2 -0
  224. package/openapi/gen/models/trainingRunMessage.ts +2 -0
  225. package/openapi/gen/models/trainingRunOutputModelVersionRevision.ts +2 -0
  226. package/openapi/gen/models/trainingRunProgress.ts +3 -0
  227. package/openapi/gen/models/trainingRunProgressAnyOf.ts +10 -0
  228. package/openapi/gen/models/trainingRunProgressAnyOfMessage.ts +2 -0
  229. package/openapi/gen/models/trainingRunProgressAnyOfStep.ts +2 -0
  230. package/openapi/gen/models/trainingRunProgressAnyOfTotal.ts +2 -0
  231. package/openapi/gen/models/trainingRunQuote.ts +17 -0
  232. package/openapi/gen/models/trainingRunQuoteBudget.ts +9 -0
  233. package/openapi/gen/models/trainingRunQuoteInputs.ts +7 -0
  234. package/openapi/gen/models/trainingRunQuoteInputsTraining.ts +9 -0
  235. package/openapi/gen/models/trainingRunQuoteInputsTrainingFailure.ts +3 -0
  236. package/openapi/gen/models/trainingRunQuoteInputsTrainingFailureAnyOf.ts +7 -0
  237. package/openapi/gen/models/trainingRunQuoteInputsTrainingFailureAnyOfCode.ts +2 -0
  238. package/openapi/gen/models/trainingRunQuoteInputsTrainingReport.ts +3 -0
  239. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOf.ts +9 -0
  240. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfErrorsItem.ts +5 -0
  241. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfTokens.ts +10 -0
  242. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfTokensEstimatorVersion.ts +2 -0
  243. package/openapi/gen/models/trainingRunQuoteInputsTrainingReportAnyOfTokensTotal.ts +2 -0
  244. package/openapi/gen/models/trainingRunQuoteInputsValidation.ts +3 -0
  245. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOf.ts +9 -0
  246. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfFailure.ts +3 -0
  247. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfFailureAnyOf.ts +7 -0
  248. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfFailureAnyOfCode.ts +2 -0
  249. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReport.ts +3 -0
  250. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOf.ts +9 -0
  251. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfErrorsItem.ts +5 -0
  252. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfTokens.ts +10 -0
  253. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfTokensEstimatorVersion.ts +2 -0
  254. package/openapi/gen/models/trainingRunQuoteInputsValidationAnyOfReportAnyOfTokensTotal.ts +2 -0
  255. package/openapi/gen/models/trainingRunStatus.ts +2 -0
  256. package/openapi/gen/models/updateTrainingMetadataBody.ts +5 -0
  257. package/openapi/gen/models/validatePipelineGraphBodyGraphNodesItemOneOfOnefoursevenSettingsQualityAssuranceOneOfLlmQaModelId.ts +1 -1
  258. package/openapi/gen/models/validatePipelineGraphBodyGraphNodesItemOneOfThreeoneSettingsAudienceAndPricingOneOfOneoneGenerationModelId.ts +1 -1
  259. package/openapi/gen/models/validatePipelineGraphBodyGraphNodesItemOneOfThreeoneSettingsQualityAssuranceOneOfFourLlmQaModelId.ts +1 -1
  260. package/openapi/gen/models/validatePipelineGraphBodyGraphNodesItemOneOfThreeoneSettingsQualityAssuranceOneOfLlmQaModelId.ts +1 -1
  261. package/package.json +1 -1
  262. package/skills/catalog.json +19 -7
  263. package/skills/toloka-build/SKILL.md +3 -3
  264. package/skills/toloka-build/references/node-semantics.md +2 -1
  265. package/skills/toloka-build/references/workflow-and-cli.md +19 -2
  266. package/skills/toloka-report-issue/references/report-template.md +1 -1
  267. package/src/cli/auth.ts +1 -1
  268. package/src/cli/bin.ts +1 -1
  269. package/src/cli/cost.ts +1 -1
  270. package/src/cli/models.ts +107 -2
  271. package/src/cli/program.ts +243 -0
  272. package/src/cli/project-context.ts +9 -10
  273. package/src/cli/project.ts +2 -1
  274. package/src/cli/secrets.ts +4 -4
  275. package/src/cli/trainings.ts +627 -0
  276. package/src/client.ts +164 -30
  277. package/src/index.ts +2 -0
  278. package/src/pipeline-graph-v1.contract.json +16 -6
  279. package/openapi/gen/models/createDatasetExportBodyOneOf.ts +0 -6
  280. package/openapi/gen/models/createDatasetExportBodyOneOfFormat.ts +0 -2
  281. package/openapi/gen/models/createDatasetExportBodyOneOfThree.ts +0 -10
  282. package/openapi/gen/models/createDatasetExportBodyOneOfThreeContract.ts +0 -2
  283. package/openapi/gen/models/createDatasetExportBodyOneOfThreeFormat.ts +0 -2
  284. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilter.ts +0 -9
  285. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItem.ts +0 -6
  286. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItemSourcesItem.ts +0 -4
  287. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItemSourcesItemOneOf.ts +0 -5
  288. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldSourcesItemSourcesItemOneOfTwo.ts +0 -5
  289. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItem.ts +0 -12
  290. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemOperator.ts +0 -2
  291. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemSourcesItem.ts +0 -4
  292. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemSourcesItemOneOf.ts +0 -5
  293. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemSourcesItemOneOfTwo.ts +0 -5
  294. package/openapi/gen/models/createDatasetExportBodyOneOfThreeItemFilterFieldValuesItemValue.ts +0 -2
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,
@@ -79,6 +80,20 @@ import {
79
80
  pipelineRunStatus,
80
81
  startPipelineRun,
81
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";
82
97
 
83
98
  import type { RunOutcome } from "./runs";
84
99
  import { skillInstallCommand, skillListCommand, skillSearchCommand } from "./skill";
@@ -129,6 +144,55 @@ const positiveInteger = (raw: string): number => {
129
144
  return value;
130
145
  };
131
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
+
132
196
  const exitCodeForOutcome = (outcome: RunOutcome): number => {
133
197
  if (outcome === "failed") return 1;
134
198
  if (outcome === "timedOut") return 2;
@@ -798,6 +862,185 @@ export function createProgram(context: ProgramContext): CreatedProgram {
798
862
  await archiveModel(client, { projectId, nameOrId, json: options.json }, context.io);
799
863
  });
800
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
+
801
1044
  const dataset = program
802
1045
  .command("dataset")
803
1046
  .description("inspect and move dataset catalog and rows");
@@ -35,10 +35,10 @@ export type ProjectCreateApi = {
35
35
  };
36
36
 
37
37
  export const MISSING_PROJECT_ID_MESSAGE =
38
- "Missing project ID. Pass --project-id, set TOLOKA_PROJECT_ID, set projectId in toloka.json, or run toloka project add.";
38
+ "Missing project ID. Pass --project-id, set TOLOKA_PROJECT_ID, use a bound toloka.json, run toloka project create for a new project, or run toloka project add for an existing project.";
39
39
 
40
40
  export const NO_PROJECT_SELECTED_MESSAGE =
41
- "No project selected. Run toloka project add, or cd into a checkout.";
41
+ "No project selected. Run toloka project create for a new project, toloka project add for an existing project, or cd into a checkout.";
42
42
 
43
43
  const NETWORK_MISMATCH_MESSAGE =
44
44
  "project add writes the machine registry; unset --api-key / --base-url / POTATO_API_KEY / POTATO_BASE_URL, or run login against that platform first.";
@@ -168,7 +168,8 @@ export const formatProjectContextLine = (
168
168
  project: ProjectContext | undefined,
169
169
  stored?: StoredCredentials,
170
170
  ): string => {
171
- if (project === undefined) return "Project: (none). Run toloka project add.";
171
+ if (project === undefined)
172
+ return "Project: (none). Run toloka project create or toloka project add.";
172
173
  const alias = project.alias === undefined ? "" : `alias ${project.alias}, `;
173
174
  const registryNote =
174
175
  project.source !== "registry" && stored?.current !== undefined
@@ -232,14 +233,12 @@ export async function listRemoteProjects(options: {
232
233
  }): Promise<{ readonly output: string }> {
233
234
  const limit = options.limit ?? 20;
234
235
  const page = await options.client.projects.listPage({ limit });
235
- const lines = page.projects.map((project) => {
236
- const mark = options.context?.id === project.id ? "*" : " ";
237
- const alias =
238
- options.context?.id === project.id && options.context.alias !== undefined
239
- ? `\t${options.context.alias}`
240
- : "";
241
- return `${mark}\t${project.id}\t${project.name}\t${project.teamId}${alias}`;
236
+ const rows = page.projects.map((project) => {
237
+ const current = options.context?.id === project.id;
238
+ const alias = current ? (options.context.alias ?? "-") : "-";
239
+ return `${current ? "*" : "-"}\t${project.id}\t${project.name}\t${alias}`;
242
240
  });
241
+ const lines = rows.length === 0 ? [] : ["CURRENT\tID\tNAME\tALIAS", ...rows];
243
242
  if (page.pagination.hasMore) {
244
243
  lines.push(
245
244
  `Showing ${page.projects.length} of ${page.pagination.total} projects. Raise --limit to see more.`,
@@ -848,10 +848,11 @@ export async function applyProject(
848
848
  if (valueKey(inspection.state) !== valueKey(nextState))
849
849
  await writeTolokaState(options.sourceRoot, nextState);
850
850
  const action = writes === 0 ? "unchanged" : "changed";
851
+ const plannedChanges = inspection.changes.length;
851
852
  const output =
852
853
  writes === 0
853
854
  ? "No changes."
854
- : `Applied ${writes} ${writes === 1 ? "write" : "writes"} to project ${inspection.projectId}.`;
855
+ : `Applied ${plannedChanges} planned ${plannedChanges === 1 ? "change" : "changes"} with ${writes} platform ${writes === 1 ? "write" : "writes"} to project ${inspection.projectId}.`;
855
856
  return {
856
857
  action,
857
858
  state: nextState,
@@ -1,13 +1,13 @@
1
- import type { PipelineGraphV1 } from '../../openapi/gen/models';
1
+ import type { PipelineGraphV1 } from "../../openapi/gen/models";
2
2
 
3
3
  export function collectGraphSecretNames(graph: {
4
- readonly nodes: ReadonlyArray<PipelineGraphV1['nodes'][number]>;
4
+ readonly nodes: ReadonlyArray<PipelineGraphV1["nodes"][number]>;
5
5
  }): readonly string[] {
6
6
  const names = new Set<string>();
7
7
  for (const node of graph.nodes) {
8
- if (node.type !== 'code') continue;
8
+ if (node.type !== "code") continue;
9
9
  for (const environmentVariable of node.settings.envVars ?? []) {
10
- if (environmentVariable.type === 'secret') names.add(environmentVariable.secretName);
10
+ if (environmentVariable.type === "secret") names.add(environmentVariable.secretName);
11
11
  }
12
12
  }
13
13
  return [...names].toSorted((left, right) => left.localeCompare(right));