Skip to content

feat(cli): models list shows which speech models transcribe can use - #5323

Merged
miguel-heygen merged 4 commits into
mainfrom
feat/cli-models-list
Oct 9, 2026
Merged

miguel-heygen merged 4 commits into
mainfrom
feat/cli-models-list

Conversation

@miguel-heygen

@miguel-heygen miguel-heygen commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

What changes for a user

hyperframes models list now shows the speech models transcribe can use, and --json prints them as one result. Before, models only knew install parakeet, so models list and models list --json stopped at the argument parser with Missing required positional argument: NAME. Agents ask for this command on their own when they want to know whether transcription will run locally.

$ hyperframes models list
parakeet parakeet-tdt-0.6b-v3  Parakeet needs glibc 2.32 or newer; this system has glibc 2.31.
whisper  small                 installed
whisper  small.en              installed
whisper  tiny                  installed

$ hyperframes models list --json
{"ok":true,"models":[{"engine":"parakeet","model":"parakeet-tdt-0.6b-v3","installed":false,"path":"…/parakeet/parakeet-tdt-0.6b-v3-int8","unsupported":"Parakeet needs glibc 2.32 or newer; this system has glibc 2.31."},{"engine":"whisper","model":"small","installed":true,"path":"…/whisper/models/ggml-small.bin"}, …]}

How it decides

  • Parakeet is installed exactly when transcribe would run it: the CLI's own sherpa-onnx runtime with the pinned model, or else parakeet-mlx. Both commands now ask one function for that (whisper/parakeetRunner.ts; transcribe's pickRunner uses it too), and the row says which in runner. When the system cannot run it, the row carries the reason in unsupported. It is always listed, so a caller learns it exists and how to get it.
  • Whisper lists each ggml-<model>.bin already downloaded into the whisper models folder, by the name --model takes. The new listWhisperModels helper sits beside ensureModel in whisper/manager.ts, which owns that folder. Partial or sidecar files (.part, .verified) and dangling links (which ensureModel would download again) are not listed.
  • The JSON keeps the { ok, ... } shape of models install --json.
  • models install with no name, or an unknown action, still fails with exit 1 and now names both commands.

Tests

  • commands/models.test.ts runs list --json through citty's own parser (runCommand), where the old failure happened, and checks the unsupported-system row and the parakeet-mlx row. Exit 0, 10 passed, three runs in a row. transcribe.test.ts (34) and parakeet.test.ts (15) still pass on the shared runner check.
  • whisper/manager.list.test.ts: no folder lists nothing; only ggml-*.bin files are listed; a dangling link is skipped (skipped on Windows like the repo's other symlink tests, since creating a link there can need extra rights). Exit 0, 3 passed, three runs in a row.
  • Mutations: models.ts from main fails all three list tests with Missing required positional argument: NAME; an unanchored file pattern fails the listing test; dropping the unsupported guard fails the unsupported-system test; dropping the parakeet-mlx branch fails the list test and two transcribe tests; dropping the link check fails the dangling-link test; showing unsupported on an installed row fails the parakeet-mlx test.
  • tsc --noEmit for the CLI, oxlint and oxfmt are clean.
  • Ran the command from source on a Linux box: models list --json exits 0; models install (no name) and models bogus --json exit 1.

Known edges

  • If the whisper models path is a file rather than a folder, models list fails with the filesystem error instead of a JSON result.
  • Whisper rows mean the model file is there; transcribe installs whisper-cpp itself on first use.
  • models list extra ignores the extra word, as citty does for other commands.
  • A Parakeet row that is not installed still names path: that is where models install parakeet puts it.

@mintlify

mintlify Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
hyperframes 🟢 Ready View Preview Oct 9, 2026, 3:29 AM

💡 Tip: Enable Automations to automatically generate PRs for you.

@kindrickjudith-crypto

Copy link
Copy Markdown

How about my games

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Edit accuracy: accurate 2059 (base branch 2059), smooth 1616 of those

The gate passes.
Smoothness is reported in the artifact, not gated. A case fails only if it fails 2 of 3 runs.

Quarantined, measured but not gated (0)

@miguel-heygen
miguel-heygen marked this pull request as ready for review October 9, 2026 04:57

@somanshreddy somanshreddy left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving at 4586c42f; I found no blockers.

  • Runner choice is unchanged. parakeetRunner gives the same answer transcribe used to inline: sherpa when it's supported and installed, then parakeet-mlx, otherwise null. The fallback after a Parakeet failure, skipSherpa: true, matches the old () => false. list and transcribe now share this one function.
  • Whisper listing matches what transcribe uses. listWhisperModels uses the same check as ensureModel (existsSync(MODELS_DIR/ggml-<model>.bin)), so it lists exactly the models transcribe would use without downloading. .part files and dangling links are skipped.
  • Tests: models, manager.list, transcribe and parakeet all pass, 62/62. I tried 4 mutants and the tests caught every one: dropping the dangling-link existsSync, dropping skipSherpa, setting unsupported on an mlx-installed row, and removing the list route.

— Somu

@miguel-heygen
miguel-heygen added this pull request to the merge queue Oct 9, 2026
Merged via the queue into main with commit 0576b24 Oct 9, 2026
162 checks passed
@miguel-heygen
miguel-heygen deleted the feat/cli-models-list branch October 9, 2026 07:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants