{
  "markdown": "# openrouter-model-list\n\n[![README Style](https://img.shields.io/badge/README%20style-standard-2ea44f)](https://github.com/RichardLitt/standard-readme)\n[![CI](https://github.com/smoochy/openrouter-model-list/actions/workflows/update-models.yml/badge.svg)](https://github.com/smoochy/openrouter-model-list/actions)\n\n[![Coindrop](https://img.shields.io/badge/Tip%20me%20crypto-smoochy-FFB655?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDUxMikgc2NhbGUoLjEgLS4xKSIgZmlsbD0iIzAwMCI%2BPHBhdGggZD0iTTE5NjIgNTAwOCBjMCAtNDAgMCAtNzkgLTEgLTg1IC0xIC05IC0yNSAtMTMgLTg2IC0xMyBsLTg1IDAgMCAtODUgYzAgLTYxIDQgLTg1IDEzIC04NiA2IDAgNDUgMCA4NSAxIDgyIDEgNzUgMTIgNzQgLTEwNyBsLTEgLTYzIDg3IDAgODcgMCAwIDgzIC0xIDgyIC04NiAzIC04NSAzIDEgODIgMSA4MiA4MyAzIGM2OCAyIDgyIDAgODMgLTEzIDAgLTggMSAtNDYgMiAtODUgbDAgLTcwIDg3IDAgODYgMCAtMSA4MyAtMSA4MiAtODYgMyAtODYgMyAxIDgyIDIgODIgLTg3IDMgLTg2IDMgMCAtNzN6Ii8%2BPHBhdGggZD0iTTM5MzIgNDgyMCBjLTQgLTMgLTcgLTQyIC02IC04NiBsMCAtODIgLTc5IDIgYy00MyAxIC04MiAtMSAtODYgLTQgLTQgLTMgLTcgLTQxIC03IC04NSBsMSAtODAgNzAgLTIgYzEwNCAtMyAxMDEgLTUgMTAwIDgzIC0xIDg5IDAgOTAgMTAxIDg5IGw3MCAtMiAtMiA4MSBjLTEgNDUgLTIgODQgLTMgODcgLTEgNiAtMTUwIDYgLTE1OSAtMXoiLz48cGF0aCBkPSJNNDEwMiA0NjQ1IGMtMyAtNSAtNiAtNDQgLTcgLTg3IGwwIC03NiA4NSAwIDg2IDEgMCA4NSAtMSA4NSAtNzggMSBjLTQ0IDEgLTgyIC0zIC04NSAtOXoiLz48cGF0aCBkPSJNMjg0MCA0NTUzIGMtMzAzIC02MyAtNTUyIC0zMTAgLTYwNCAtNTk5IC0xOCAtOTkgLTEyIC05MSAtNjkgLTk4IC0xNDkgLTIwIC0xMzAgLTI1IC0xNzUgNDEgLTc0IDEwOCAtMTg0IDIwMSAtMzEyIDI2MSAtNjkgMzMgLTE5NyA2MyAtMjc3IDY1IC02NCAyIC03NiAtMSAtOTUgLTIxIC0yMyAtMjIgLTIzIC0yNiAtMjYgLTMyNiBsLTMgLTMwMyAtNDIgLTIzIGMtMjYwIC0xNDMgLTUyMiAtMzg5IC02ODIgLTY0MiBsLTMwIC00NyAtMTkwIC0xIGMtMTA0IDAgLTIwMiAtMyAtMjE3IC03IC00MCAtMTEgLTk2IC02OSAtMTA4IC0xMTEgLTggLTI1IC0xMCAtMjE0IC04IC01ODMgbDMgLTU0NSAyNyAtNDEgYzQ1IC02OSA3MyAtNzYgMzAyIC03OCAxNTUgLTEgMjAxIC00IDIwNCAtMTQgNiAtMTggMTA4IC0xNjcgMTQxIC0yMDQgMTE4IC0xMzcgMjA3IC0yMjQgMzIwIC0zMTEgNDIgLTMyIDEwMCAtNzIgMTI4IC04OCAyOSAtMTcgNTYgLTM1IDYwIC00MSA0IC02IDcgLTE1OCA4IC0zMzcgMCAtMzIyIDEgLTMyNSAyNCAtMzY2IDE0IC0yNSA0MCAtNTEgNjUgLTY1IDQwIC0yMyA0NyAtMjMgMzIxIC0yNCAxNTQgMCAyOTYgMyAzMTYgOCA0OSAxMiAxMDUgNjYgMTE4IDExNCA2IDIxIDExIDEwOSAxMSAxOTYgMCAxNDYgMSAxNTggMTggMTUzIDkgLTMgNDIgLTggNzIgLTExIDMwIC0zIDYyIC04IDcwIC0xMCAzNyAtMTAgMjA5IC0xOSAzNTUgLTE5IDIzMCAwIDMzNiAxMSA1ODkgNjAgNjYgMTIgMjM2IDYwIDMxOSA4OSA1NCAxOSAxMDEgMzUgMTA1IDM1IDQgMCA3IC0xMDcgNyAtMjM4IDAgLTIyNiAxIC0yMzkgMjIgLTI4MyAxNiAtMzEgMzYgLTUzIDY1IC02OSA0MyAtMjQgNDUgLTI0IDMzOCAtMjQgMzM1IDAgMzQ2IDIgMzk3IDc3IGwyOCA0MiAxIDU1MSAxIDU1MSA0NCA1OSBjMTQ0IDE5MCAyNDAgNDE1IDI4MyA2NjEgNCAyMiAxMyAyNCA0OSAxMCA0NSAtMTkgNTAgLTM4IDUyIC0yMjIgMSAtMTM3IDMgLTE1NCAyNCAtMTkxIDMwIC01MyA4NCAtODQgMTUzIC04OCAyOSAtMiA1OSAtMSA2NiAyIDggMyAxMiAzMCAxMiA4NyBsMCA4MiAtNDIgLTEgLTQzIC0xIC0xIDE1NSBjLTEgMTM0IC00IDE2MiAtMjEgMjAyIC0zNiA4MCAtOTYgMTI4IC0xOTIgMTUyIGwtNDMgMTIgLTQgNzQgYy0yIDQxIC02IDkxIC0xMCAxMTAgLTMgMTkgLTggNDYgLTExIDYwIC0zMiAxODEgLTEyNiAzOTQgLTI1MSA1NzAgLTU2IDc4IC0yNDAgMjc2IC0zMTcgMzQwIC0xMDUgODcgLTMwMSAyMTQgLTQwOCAyNjQgbC0zOSAxOCA4IDcxIGMxNCAxNDEgNiAyMzIgLTMxIDM0NSAtODkgMjY0IC0zMDUgNDU2IC01ODQgNTE4IC01NCAxMiAtMjI4IDEwIC0yOTEgLTN6Ii8%2BPHBhdGggZD0iTTM5MzEgNDQ3NSBjLTYgLTggLTcgLTEwNCAtMiAtMTUzIDEgLTEwIDIyIC0xMiA4NCAtMTAgbDgyIDMgMCA3OCBjMSA0MyAtMyA4MSAtOCA4NCAtMTcgMTAgLTE0OCA4IC0xNTYgLTJ6Ii8%2BPHBhdGggZD0iTTQ2OTQgNDA1OCBsMSAtODMgLTg2IC0zIC04NiAtMyAwIC04NCAwIC04NCA4NiAtMyA4NiAtMyAtMSAtODMgLTEgLTgzIDg2IDMgODYgMyAwIDgwIDAgODAgLTg2IDMgLTg2IDMgMSA4NCAwIDg0IDg1IDMgODUgMyAxIDgzIDEgODIgLTg3IDAgLTg3IDAgMiAtODJ6Ii8%2BPHBhdGggZD0iTTQ4NjQgMzg4OCBsMSAtODMgODUgMCA4NSAwIDAgODAgLTEgODAgLTg1IDMgLTg1IDMgMCAtODN6Ii8%2BPC9nPjwvc3ZnPg%3D%3D)](https://coindrop.to/smoochy) [![Tip me uptime](https://img.shields.io/badge/Tip%20me%20uptime%20%F0%9F%96%A5%EF%B8%8F-smoochy84-E9C46A?logo=buymeacoffee&logoColor=000000)](https://www.buymeacoffee.com/smoochy84) [![Ko-fi](https://img.shields.io/badge/Ko--fi-smoochy-7CC6FE?logo=ko-fi&logoColor=000000)](https://ko-fi.com/smoochy)\n\n> Daily-refreshed, scored lists of free OpenRouter models for different use cases. Consumers point at the file matching their requirements; the workflow keeps it current without manual upkeep.\n\nThis repository publishes `models-mengram.json`: a ranked, scored set of free\nOpenRouter models that meet mengram's extraction requirements (context\nlength, output tokens, structured-output support). A scheduled GitHub\nActions workflow re-fetches the OpenRouter catalog, probes each candidate\nmodel, and rewrites `models-mengram.json` so consumers always have a working\nfallback list without manual upkeep.\n\nIf this project saves you time or helps your setup, you can support ongoing\nmaintenance via Coindrop, Ko-fi, or Buy Me a Coffee.\n\n## Table of Contents\n\n- [Background](#background)\n- [How It Works](#how-it-works)\n- [Configuration](#configuration)\n- [Output Format](#output-format)\n- [Consuming](#consuming)\n- [When the Workflow Runs](#when-the-workflow-runs)\n- [Anthropic Model List](#anthropic-model-list)\n- [Probe History](#probe-history)\n- [Transparency](#transparency)\n- [Security](#security)\n- [Maintainers](#maintainers)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Background\n\nmengram's self-hosted LLM config previously pointed at a single hardcoded\nfree OpenRouter model. Free models on OpenRouter occasionally get retired or\nrenamed, which made that configuration brittle and caused silent extraction\nfailures. This repository provides a maintained, automatically updated\nfallback list so mengram can select from several known-good free models\ninstead of relying on one.\n\n## Available Model Lists\n\n| File | Use Case | Key Requirement |\n| ---- | -------- | --------------- |\n| [`models-mengram.json`](models-mengram.json) | [mengram](https://github.com/alibaizhanov/mengram) knowledge extraction | Structured output (`response_format`) support, ≥40k context |\n| [`models-yt-summarizer.json`](models-yt-summarizer.json) | [yt-transcript-distiller](https://github.com/smoochy/yt-transcript-distiller) — YouTube transcript summarization | ≥32k context, plain text generation (no structured output required) |\n| [`anthropic-models.json`](anthropic-models.json) | [yt-transcript-distiller](https://github.com/smoochy/yt-transcript-distiller) — Claude model selector | List of current Anthropic Claude models (fetched weekly from Anthropic API) |\n\nEach file is independently generated with its own `thresholds-*.yaml` configuration. Point your `model_list_url` at the file matching your use case.\n\n## How It Works\n\n1. Fetch all OpenRouter models and keep the free ones\n   (`pricing.prompt == \"0\"` and `pricing.completion == \"0\"`).\n2. Filter the remaining models by `thresholds-mengram.yaml`:\n   - `min_param_b` — hard floor, never buffered. Parsed from the model id\n     (e.g. `qwen/qwen3-32b:free` -> 32). Models where no size can be parsed\n     are excluded unless listed in `allowlist`.\n   - `min_context_length` / `min_max_output_tokens` — buffered by\n     `buffer_pct`. If too few models pass, `buffer_pct` is reduced toward 0\n     until `min_candidate_pool` models pass. A missing or null\n     `max_completion_tokens` is treated as unknown (not zero) and doesn't by\n     itself fail this check.\n   - `require_structured_output` — requires `response_format` or\n     `structured_outputs` in the model's `supported_parameters`.\n   - `min_uptime` / `max_latency_ms` — optional post-probe filters, applied to\n     OpenRouter's aggregated endpoint stats (`uptime` / `latency_ms`, see\n     [Probe History](#probe-history)). Leave empty to disable.\n   - `allowlist` — model IDs that always enter the candidate pool, skipping\n     `min_param_b` and the context/output thresholds, but still subject to\n     `require_structured_output` (if enabled) — excluded with a warning if\n     the model doesn't report structured-output support. Still probed and\n     scored normally. Use this for models known to be suitable whose id\n     doesn't encode a parseable size (e.g. `openrouter/owl-alpha`).\n   - `hardallowlist` — model IDs that always enter the candidate pool,\n     skipping all of the checks above including `require_structured_output`.\n     Still probed and scored normally. Use this for models known to be\n     suitable that don't report structured-output support via the catalog\n     API.\n3. For each surviving candidate, fetch OpenRouter's aggregated endpoint stats\n   (`uptime_last_1d`, `latency_last_30m.p50`) via the `/endpoints` API,\n   averaged across the model's free endpoints. If no free endpoints are\n   reported (or the request fails), fall back to a neutral 0.5 uptime and no\n   latency score, and log a warning.\n4. Also probe each candidate once with a 1-token completion request and\n   record `{timestamp, success, latency_ms}` to `history/<model>.jsonl`\n   (rolling 30-day window). A failed probe logs a warning. The 30-day success\n   rate from this history (`own_uptime`) acts as a malus multiplier on the\n   final score — new models default to a neutral 0.5 malus until they\n   accumulate 3+ probes.\n5. Score each candidate as\n   `(0.6*uptime + 0.3*latency_norm + 0.1*capability_norm) * own_uptime`\n   (OpenRouter's uptime matters most, then latency, then context/parameter\n   size, all multiplied by our own reliability malus) and sort descending\n   into the output file.\n\n## Configuration\n\nAll tuning happens in `thresholds-mengram.yaml`:\n\n```yaml\nmin_param_b: 28\nmin_context_length: 40000\nmin_max_output_tokens: 8000\nbuffer_pct: 5\nrequire_structured_output: true\nmin_uptime:\nmax_latency_ms:\nmin_candidate_pool: 3\nhardallowlist: []\nallowlist:\n  - openrouter/owl-alpha\n```\n\nEdit the file and either wait for the next scheduled run or trigger\n`workflow_dispatch` manually.\n\n## Output Format\n\n`models-mengram.json`:\n\n```json\n{\n  \"generated_at\": \"2026-06-14T03:00:00Z\",\n  \"schema_version\": 2,\n  \"models\": [\n    {\n      \"id\": \"nvidia/nemotron-3-super-120b-a12b:free\",\n      \"score\": 0.8123,\n      \"context_length\": 131072,\n      \"max_output_tokens\": 32768,\n      \"uptime\": 1.0,\n      \"latency_ms\": 842,\n      \"own_uptime\": 1.0,\n      \"sanity_ok\": true\n    }\n  ]\n}\n```\n\n- `uptime` — OpenRouter's aggregated `uptime_last_1d`, averaged across the\n  model's free endpoints (0-1 fraction). Falls back to 0.5 (neutral) if no\n  free endpoint stats are available.\n- `latency_ms` — OpenRouter's aggregated `latency_last_30m.p50`, averaged\n  across free endpoints (ms). `null` if unavailable.\n- `own_uptime` — our own 30-day rolling sanity-probe success rate (0-1\n  fraction), used as a malus multiplier on the score. Defaults to 0.5 for new\n  models with fewer than 3 probes.\n- `sanity_ok` — whether today's 1-token sanity probe succeeded.\n\n`schema_version` increments whenever a field is added, removed, or changes\nmeaning, so consumers can detect incompatible changes.\n\n## Consuming\n\n```\nhttps://raw.githubusercontent.com/smoochy/openrouter-model-list/main/models-mengram.json\n```\n\nmengram reads this URL via its `model_list_url` config option and falls back\nthrough the ranked list if the primary model becomes unavailable.\n\n## When the Workflow Runs\n\n`.github/workflows/update-models.yml` runs:\n\n- **Scheduled**: daily at 03:00 UTC\n- **Manual**: via `workflow_dispatch`\n\nEach run regenerates the model list files and the per-model probe history under\n`history/`, and commits the changes only if something changed.\n\n## Anthropic Model List\n\n`anthropic-models.json` contains the current set of Anthropic Claude models,\nfetched weekly from `https://api.anthropic.com/v1/models`. Format:\n\n```json\n[\n  { \"id\": \"claude-haiku-4-5-20251001\", \"display_name\": \"Claude Haiku 4.5\", \"type\": \"model\", \"created_at\": 1748995200 },\n  { \"id\": \"claude-opus-4-8\", \"display_name\": \"Claude Opus 4.8\", \"type\": \"model\", \"created_at\": 1749600000 },\n  { \"id\": \"claude-sonnet-4-6\", \"display_name\": \"Claude Sonnet 4.6\", \"type\": \"model\", \"created_at\": 1749600000 }\n]\n```\n\nOnly entries with `type == \"model\"` are included; sorted by `id` ascending. Note: the field is `display_name` (native Anthropic API field name), not `name`.\n\n**Consumers** fetch this list from raw.githubusercontent.com:\n\n```\nhttps://raw.githubusercontent.com/smoochy/openrouter-model-list/main/anthropic-models.json\n```\n\nThe [update-anthropic-models.yml](.github/workflows/update-anthropic-models.yml) workflow runs\nevery Tuesday at 03:00 UTC (plus `workflow_dispatch`) and commits only when the list changes.\n\n## Probe History\n\nEach candidate model has a rolling 30-day probe history at\n`history/<safe-model-id>.jsonl`, one JSON object per probe\n(`{timestamp, success, latency_ms}`). This history feeds `own_uptime`, a\nmalus multiplier applied to the OpenRouter-derived score (see\n[How It Works](#how-it-works)). The optional `min_uptime` / `max_latency_ms`\npost-probe filters now apply to OpenRouter's aggregated endpoint stats\n(`uptime` / `latency_ms`), not this history.\n\n## Transparency\n\nThe code, documentation, and related project materials in this repository\nwere created and refined with AI assistance. All generated output was\nreviewed and adapted before publication.\n\n## Security\n\n- No secrets are committed to the repository\n- The workflow uses the `OPENROUTER_API_KEY` repository secret to fetch the\n  catalog and probe candidate models\n- The built-in `GITHUB_TOKEN` is used to commit the model list files and\n  `history/` updates\n\n## Maintainers\n\n- smoochy\n\n## Contributing\n\nIssues and pull requests are welcome. Keep `thresholds-*.yaml`, the filtering\nand scoring code, and this README aligned so the published model list\nbehavior stays easy to audit.\n\n## License\n\n[MIT](./LICENSE) 2026 [smoochy](https://github.com/smoochy)\n",
  "bytes": 13595,
  "sha": "321f6b6c761000786ced839b4cb86b5ad6e18909fe8e12f69e741b7cf8434642",
  "repo_slug": "smoochy/openrouter-model-list",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_smoochy_openrouter_model_list_openwiki_i_3ec57f46/readme"
}