@tuned-tensor/cli 0.4.22 → 0.4.24

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.
package/README.md CHANGED
@@ -1,8 +1,11 @@
1
1
  # tt - Tuned Tensor CLI
2
2
 
3
- `tt` is the command-line tool for [Tuned Tensor](https://www.tunedtensor.com).
4
- Use it to define behaviour specs, validate them, launch fine-tuning runs,
5
- manage datasets, and download or serve trained models.
3
+ `tt` is the command-line client for the optional managed
4
+ [Tuned Tensor](https://www.tunedtensor.com) service. Use it to define behaviour
5
+ specs, launch managed fine-tuning runs, inspect paired baseline-vs-tuned
6
+ reports, and download or serve trained models. For local CUDA or DGX Spark
7
+ training without a Tuned Tensor account, use `tt-local` from
8
+ `@tuned-tensor/local`.
6
9
 
7
10
  The main CLI documentation lives at
8
11
  [tunedtensor.com/docs/cli](https://tunedtensor.com/docs/cli). This README is a
@@ -37,6 +40,7 @@ tt push
37
40
  tt runs estimate <spec-id>
38
41
  tt runs start <spec-id>
39
42
  tt runs watch <run-id>
43
+ tt runs report <run-id>
40
44
  ```
41
45
 
42
46
  To continue training from a completed fine-tuned model artifact:
@@ -51,11 +55,16 @@ Useful discovery commands:
51
55
  tt specs list
52
56
  tt datasets list
53
57
  tt runs list
58
+ tt runs list --summary --json
54
59
  tt models list
55
60
  tt models base
56
61
  tt balance
57
62
  ```
58
63
 
64
+ Use `tt runs list --summary` for agents and scripts that only need run status,
65
+ scores, and pagination. It asks the API to omit detailed evaluation and event
66
+ payloads; combine it with `--json` for compact structured output.
67
+
59
68
  Label real, unlabeled data with a teacher model (JSONL with `{"input": ...}`
60
69
  rows, or CSV with `--input-column`; up to 50,000 rows / 50 MB). Labeling runs
61
70
  as a managed cloud workflow — upload and disconnect; the teacher drafts
package/dist/index.js CHANGED
@@ -652,6 +652,7 @@ function formatEstimateRange(estimate) {
652
652
  return `${formatMinutes(duration.estimated_minutes)} (${formatMinutes(duration.range_minutes.low)}-${formatMinutes(duration.range_minutes.high)})`;
653
653
  }
654
654
  function printRunEstimate(estimate) {
655
+ const billing = estimate.billing;
655
656
  printDetail([
656
657
  ["Estimated Time", formatEstimateRange(estimate)],
657
658
  ["Confidence", estimate.duration.confidence],
@@ -659,7 +660,20 @@ function printRunEstimate(estimate) {
659
660
  ["Basis", estimate.duration.basis.replaceAll("_", " ")],
660
661
  ["Estimated Cost", formatCents(estimate.estimated_cost_cents)],
661
662
  ["Training Tokens", `${(estimate.estimated_training_tokens / 1e3).toFixed(1)}k`],
662
- ["Epochs", String(estimate.estimated_epochs)]
663
+ ["Epochs", String(estimate.estimated_epochs)],
664
+ ["Plan", billing?.plan],
665
+ [
666
+ "Billing Source",
667
+ billing?.billing_source === "free_quota" ? "Free monthly quota" : billing?.billing_source === "credits" ? "Credits" : void 0
668
+ ],
669
+ [
670
+ "Free Runs",
671
+ billing ? `${billing.free_runs_remaining}/${billing.free_runs_monthly_limit} remaining` : void 0
672
+ ],
673
+ [
674
+ "Free Eligible",
675
+ billing ? billing.free_run_eligible ? "yes" : `no (${billing.free_run_ineligibility.join(", ") || "not eligible"})` : void 0
676
+ ]
663
677
  ]);
664
678
  console.log(
665
679
  "\nDuration is a rough historical range. Final cost uses provider-reported training tokens."
@@ -937,19 +951,23 @@ async function buildRunRequestBody(cmdOpts, opts) {
937
951
  }
938
952
  function registerRunsCommands(parent) {
939
953
  const runs = parent.command("runs").description("Manage runs");
940
- runs.command("list").description("List runs").option("-s, --spec <id>", "Filter by spec ID (full UUID or 8+ char prefix)").option("-p, --page <n>", "Page number", "1").option("--per-page <n>", "Results per page", "20").action(async (cmdOpts) => {
954
+ runs.command("list").description("List runs").option("-s, --spec <id>", "Filter by spec ID (full UUID or 8+ char prefix)").option("-p, --page <n>", "Page number", "1").option("--per-page <n>", "Results per page", "20").option("--summary", "Request compact run summaries without detailed eval payloads or events").action(async (cmdOpts) => {
941
955
  const opts = parent.opts();
942
956
  let path = "/runs";
943
957
  const query = {
944
958
  page: cmdOpts.page,
945
959
  per_page: cmdOpts.perPage
946
960
  };
961
+ if (cmdOpts.summary) query.view = "summary";
947
962
  if (cmdOpts.spec) {
948
963
  const fullSpecId = await resolveSpecId(cmdOpts.spec, opts);
949
964
  path = `/behavior-specs/${fullSpecId}/runs`;
950
965
  }
951
- const { data, meta } = await get(path, query, opts);
952
- if (isJsonMode()) return printJson({ data, meta });
966
+ const response = await get(path, query, opts);
967
+ const { data, meta } = response;
968
+ if (isJsonMode()) {
969
+ return printJson(cmdOpts.summary ? response : { data, meta });
970
+ }
953
971
  printTable(
954
972
  ["ID", "Spec", "#", "Status", "Score", "Started", "Completed"],
955
973
  data.map((r) => [
@@ -4123,7 +4141,7 @@ function registerPushCommand(parent) {
4123
4141
 
4124
4142
  // src/index.ts
4125
4143
  var program = new Command();
4126
- program.name("tt").description("Tuned Tensor CLI \u2014 fine-tune and evaluate LLMs").version("0.4.22").option("-k, --api-key <key>", "API key (overrides stored key)").option(
4144
+ program.name("tt").description("Tuned Tensor CLI \u2014 fine-tune and evaluate LLMs").version("0.4.24").option("-k, --api-key <key>", "API key (overrides stored key)").option(
4127
4145
  "-u, --base-url <url>",
4128
4146
  "API base URL (default: https://tunedtensor.com)"
4129
4147
  ).option("--json", "Output raw JSON").option("--no-color", "Disable colors").hook("preAction", (_thisCommand, actionCommand) => {