Skip to content

chore(tooling): review transcription models weekly - #541

Open
chhoumann wants to merge 5 commits into
feat/transcription-openrouterfrom
chore/model-review
Open

chhoumann wants to merge 5 commits into
feat/transcription-openrouterfrom
chore/model-review

Conversation

@chhoumann

@chhoumann chhoumann commented Nov 14, 2026 •

Copy link
Copy Markdown
Owner

Summary

Goal: no PodNotes user stays on an old transcription model. The curated list in src/services/transcription/providers/*.ts is the source of truth, so a maintainer needs a weekly signal when OpenRouter retires one or ships a newer one. This is tooling only and adds no plugin bytes.

  • scripts/model-review.mjs (npm run review:models) reads the curated IDs from the provider files, fetches the public GET https://openrouter.ai/api/v1/models?output_modalities=transcription (no key), and prints a short Markdown report: curated OpenRouter models missing from the catalog or carrying an expiration_date, catalog models newer than a curated model of the same vendor family (direct providers count, so deepgram/nova-4 is newer than nova-3), and uncurated models listed once as candidates. It exits 1 only when a curated OpenRouter model is gone or past its end date (same ends <= today rule the registry uses). --catalog <file> reads a saved catalog.
  • .github/workflows/model-review.yml runs it Mondays 06:00 UTC and by workflow_dispatch, never on pull requests. It uses the default GITHUB_TOKEN with contents: read and issues: write, creates or edits one open model-review issue with the report, and then fails the run when the script exited 1. It is not in protect-master.json, has no concurrency block, and pins actions to the same SHAs as test.yml.
  • AGENTS.md lists the command in Common Commands.

Base is feat/transcription-openrouter (#540), where the curated lists live.

Verification

Node 22.23.2 via fnm. All pass on this branch: npm run lint, npm run format:check, npm run typecheck, npm run test:tooling (9 files, 54 tests), npm run test (125 files, 2882 tests), npm run build. Not run: docs:build (no docs change) and Obsidian runtime checks (no plugin code change).

Tests:

  • tests/tooling/modelReview.test.ts runs the report on tests/fixtures/transcription/openrouter-catalog.json (trimmed live entries plus a deliberately retired x-ai/grok-stt-2.0 and a deliberately newer deepgram/nova-4) and runs the CLI for exit codes.
  • scripts/model-review.test.ts proves the IDs read from the provider files equal what PROVIDERS in the registry offers, so the reader cannot drift from the code.

Plants (npm run plant, each must type-check, fail the named test, and pass once restored):

Plant Caught by
else if (model.expiration_date) { to else if (model.expiration_date === "never") { (drops the expiration check) model review > reports a curated model past its end date
own.every((curatedModel) => compare(version, curatedModel.version) > 0) to own.every(() => false) (drops the family check) model review > reports a model newer than a curated model of its family

The workflow itself has not run: GitHub runs schedule only from the default branch, so the first real run needs a manual workflow_dispatch after merge to master.

Live run on 2026-11-14 (npm run --silent review:models, exit 0, 31 catalog models, every curated model present with no end date):

# Transcription model review

Checked 2026-11-14 against the OpenRouter catalog (31 models).

## Candidates, not curated

- `moondream/parakeet-ultra` (Moondream: Parakeet Ultra)
- `nvidia/nemotron-3.5-transcribe` (NVIDIA: Nemotron 3.5 Transcribe)
- `mistralai/voxtral-small-transcribe-3-0` (Mistral: Voxtral Small Transcribe 3)
- `mistralai/voxtral-mini-transcribe-3-0` (Mistral: Voxtral Mini Transcribe 3)
- `assemblyai/universal-3-6-pro` (AssemblyAI: Universal-3.6 Pro)
- `elevenlabs/scribe-v2-medical` (ElevenLabs: Scribe v2 Medical)
- `google/gemini-3.5-transcribe` (Google: Gemini 3.5 Transcribe)
- `fish-audio/transcribe-1-pro` (Fish Audio: Transcribe 1 Pro)
- `assemblyai/universal-3-5-pro` (AssemblyAI: Universal-3.5 Pro)
- `meta/muse-voice-transcribe-1.0` (Meta: Muse Voice Transcribe 1.0)
- `nvidia/nemotron-3.5-asr-streaming-multilingual-0.6b` (NVIDIA: Nemotron 3.5 ASR Streaming Multilingual 0.6B)
- `mistralai/voxtral-small-24b-2507-stt` (Mistral: Voxtral Small 24B 2507 STT)
- `mistralai/voxtral-mini-3b-2507` (Mistral: Voxtral Mini 3B 2507)
- `qwen/qwen3-asr-1.7b` (Qwen: Qwen3 ASR 1.7B)
- `qwen/qwen3-asr-0.6b` (Qwen: Qwen3 ASR 0.6B)
- `fish-audio/transcribe-1` (Fish Audio: Transcribe 1)
- `nvidia/parakeet-tdt-0.6b-v3` (NVIDIA: Parakeet TDT 0.6B v3)
- `mistralai/voxtral-mini-transcribe` (Mistral: Voxtral Mini Transcribe)
- `google/chirp-3` (Google: Chirp 3)
- `openai/gpt-4o-mini-transcribe` (OpenAI: GPT-4o Mini Transcribe)
- `openai/whisper-large-v3` (OpenAI: Whisper Large V3)
- `openai/whisper-large-v3-turbo` (OpenAI: Whisper Large V3 Turbo)
- `openai/whisper-1` (OpenAI: Whisper 1)
- `openai/gpt-4o-transcribe` (OpenAI: GPT-4o Transcribe)

Release impact

None. No plugin, settings, storage, API, or URI change. Conventional type chore does not trigger a release.

Note

Add weekly model-review workflow and npm run review:models CLI

  • Adds model-review.mjs, a CLI that compares curated transcription provider IDs (read from provider source files) against the OpenRouter catalog. It reports missing, expired, and newer models in Markdown and exits 1 when a curated model is gone or past its end date.
  • Adds a review:models npm script and a scheduled workflow that runs Mondays at 06:00 UTC or manually. It writes the report to the step summary, force-updates a model-review label, edits or creates an issue with that label, then fails the job if the review reported problems.
  • Includes tests for comparison logic and the CLI, plus an OpenRouter catalog fixture. Documents the command and workflow in AGENTS.md.
  • Risk: the workflow uses a force-push label update (model-review), so any existing issue with that label gets its body overwritten by the report.

Macroscope summarized 9f091c1.


Note

Low Risk
Tooling-only change with no plugin runtime impact; the workflow only reads the repo and writes/updates issues using the default token.

Overview
Adds npm run review:models and scripts/model-review.mjs, which read curated transcription model IDs from provider files, compare them to the public OpenRouter transcription catalog (live fetch or --catalog), and emit a Markdown report for missing or expiring curated OpenRouter models, newer family versions, and uncurated candidates. The command exits 1 when a curated OpenRouter model is absent or past its end date.

A new Model review GitHub Actions workflow runs that script weekly (Mondays) and on manual dispatch, publishes the report to the job summary, and creates or updates a single model-review issue when action is needed (without reopening on candidates-only reports). AGENTS.md and package.json document the npm script.

Coverage includes unit/CLI tests with a catalog fixture and a check that parsed provider IDs stay aligned with the transcription registry.

Reviewed by Cursor Bugbot for commit 9f091c1. Bugbot is set up for automated code reviews on this repo. Configure here.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Deploying podnotes with  Cloudflare Pages  Cloudflare Pages

Latest commit: 9f091c1
Status: ✅  Deploy successful!
Preview URL: https://5580bef7.podnotes.pages.dev
Branch Preview URL: https://chore-model-review.podnotes.pages.dev

View logs

Comment thread scripts/model-review.mjs Resolved
@chhoumann
chhoumann marked this pull request as ready for review November 14, 2026 14:49

This branch has not been deployed

No deployments
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.

1 participant