Repository navigation
[Feature]: Filter free models in Dashboard catalog (OpenRouter, KiloCode, etc.) #3666
Description
Area
Catalog / models
What are you trying to accomplish?
I use OpenRouter and KiloCode providers which offer many free models alongside paid ones. I want to quickly filter and add only free models (cost = $0) when browsing the model catalog in the Dashboard, so I can avoid accidental cost when experimenting.
What prevents this today?
The Dashboard model catalog shows all discovered models without a way to filter by cost. For OpenRouter alone this can be 200+ models, and manually checking which are free requires cross-referencing the OpenRouter pricing page. There is no "free only" toggle or price-based filter in the model list or model picker.
What should OpenCodex do?
- Add a toggle or filter option in the model catalog view: "Show only free models" (where both input and output cost = 0).
- For providers that report pricing metadata (OpenRouter, KiloCode), use it to classify models as free/paid.
- The filter should work during initial model discovery (adding a new provider) and in the existing model management view.
- Optionally add a "Free" badge or tag next to free models in the list for quick visual identification.
Example usage or interface
Dashboard model catalog view with free filter:
┌─────────────────────────────────────────────────┐
│ Provider: openrouter │
│ [✓] Show only free models [Search: ___] │
│ │
│ Model Cost Status │
│ ─────────────────────────────────────────────── │
│ google/gemma-3-1b-it:free $0.00 [✓] │
│ meta-llama/llama-4-scout $0.00 [✓] │
│ deepseek/deepseek-r1:free $0.00 [ ] │
│ ... │
└─────────────────────────────────────────────────┘
CLI equivalent:
ocx model list --provider openrouter --free-onlyAlternatives or workarounds
Manually cross-reference OpenRouter's /api/v1/models endpoint or pricing page, then individually toggle off paid models in the Dashboard. This is tedious with 200+ models and breaks on every catalog re-sync.
Additional context
- OpenRouter API provides pricing metadata in its
/api/v1/modelsresponse (fields:pricing.prompt,pricing.completion), making free-model detection straightforward. - KiloCode also reports pricing via its model listing API.
- Related: feat(providers): remove catalog models and retain default-only sync #3659 (model removal/visibility), [Feature]: Make truncated model picker labels distinguishable (provider compaction or model-first order) #3569 (model picker UX)
Checks
- I searched existing issues and documentation.
- This request describes a concrete OpenCodex workflow rather than merely naming a desired technology.
- I removed secrets and personal data.
Activity
lidge-jun commentedon Sep 5, 2026
리뷰 · 우선순위 46 / 80
이 이슈는 Dashboard 모델 카탈로그에서 OpenRouter·KiloCode처럼 무료/유료가 섞인 공급자 목록을 볼 때, 입력·출력 단가가 둘 다 0인 모델만 빨리 골라 넣는 필터를 요청합니다. 지금은 발견된 모델이 한꺼번에 나오고, 무료 여부를 확인하려면 OpenRouter 가격 페이지나
/api/v1/models의pricing.prompt/pricing.completion을 따로 대조해야 합니다. 재동기화할 때마다 그 작업을 반복해야 해서, 실험용으로 무료 모델만 쓰고 싶은 사람에게는 실수로 유료를 켜기 쉬운 상태입니다.지금
devHEAD(6585e6a70, #3668 split-train closeout)에는 이미 “무료” 개념이 여러 층에 있습니다.gui/src/provider-workspace/catalog.ts는 공급자 행을 free/paid로 나누고,ProviderCatalog.tsx/ProviderRail.tsx는freeTier·keyOptional배지를 보여 줍니다.src/providers/free-directory.ts는 공급자 단위 무료·크레딧 디렉터리입니다. 다만 이것들은 공급자 전체 표시용이고, 이슈가 말하는 한 공급자 안의 모델별 $0 필터는 아직 없습니다. OpenRouter처럼freeTier: false인데 모델 slug에:free와 유료가 섞인 경우가 바로 그 구멍입니다.구현할 때 가격 메타데이터가 없는 모델(Ollama, 일부 커뮤니티 모델)을 “무료”로 넣을지 “알 수 없음”으로 빼둘지부터 정해야 합니다. $0과 missing을 같게 취급하면 #3667에서 말하는 잘못된 $0.00 사용량과 같은 착각이 납니다. OpenRouter의
:free접미사만 보면 빠르지만, KiloCode·다른 aggregator는 접미사 규칙이 다를 수 있어pricing필드가 정답에 가깝습니다. CLIocx model list --free-only는 Dashboard와 같은 정의(입력·출력 둘 다 0)를 공유해야 하고, 카탈로그 재동기화 후에도 필터 상태가 UX로만 유지되면 충분합니다(설정에 저장할지는 선택).관련으로 #3659(모델 제거/가시성), #3569(피커 UX), #3667(수동 가격)이 붙어 있습니다. 무료 필터만 단독으로 넣어도 가치는 있고, #3667과 묶으면 “가격 정보 → 필터/배지 → 오버레이” 한 줄로 갈 수 있습니다. Preview 배포나 types/config 분할 캠페인과는 무관합니다.
gui/src/provider-workspace/catalog.ts- 공급자 free 배지만 있고 모델 행 cost=$0 필터 API가 없음ProviderCatalog.tsx/ 모델 관리 뷰 - OpenRouter 200+ 목록에서 cost 컬럼·토글 없음src/providers/free-directory.ts- 공급자 access group이라 모델별 $0 분류와 다름pricing missing vs $0 - 구분 없이 free-only에 넣으면 사용량 $0 착각과 충돌
메인테이너의 판단이 필요한 지점
:free휴리스틱을 pricing 부재 시 보조로 쓸지너의 추천
help wanted로 두고, 첫 슬라이스는 Dashboard 모델 목록 + 동일 정의의 CLI
--free-only만. missing은 제외하고 pricing=0만 free. #3667 GUI가 오면 배지/필터가 오버레이를 읽게 이어서 연결.이 댓글은 grok-bot이 작성했습니다
Sfrui commentedon Sep 6, 2026
I'd like to take this issue. I traced the current
devdata path before starting, and this appears to be a cross-layer change rather than a GUI-only filter:provider
/modelsresponses can containpricing, butcatalogHintsFromModelsApiItem()currently drops it;CatalogModelandGET /api/modelsexpose no model-level pricing state;the Dashboard model-management surfaces and the runtime CLI consume that shared API;
the current CLI command is
ocx models live --provider <name>, so the matching command would be:ocx models live --provider openrouter --free-onlyMy proposed first PR would:
pricingStatus: "free" | "paid" | "unknown"from provider-reported prompt/input and completion/output prices.freeonly when both values are explicitly present, finite, non-negative, and numerically zero. Numeric strings such as"0.00000000"would be accepted; missing, partial, negative, or invalid values would remainunknown./api/models, so the Dashboard and CLI use the same classification.--free-onlytoocx models live.I would keep manual
modelCostsediting (#3667), usage-cost resolution changes, provider-levelfreeTier, model-name heuristics such as:free, and filter persistence out of this PR.One contract question: OpenRouter and Kilo can report auxiliary price fields, and Kilo currently has model rows where prompt/completion are both zero while
isFreeis false. Should v1 follow this issue's exact prompt+completion-zero definition, or should non-zero auxiliary pricing also make a model non-free?If this scope matches your intent, please assign #3666 to me and I will open a draft PR against
dev.docs(devlog): re-split the round-2 lanes after the roadmap audit
Merge branch 'dev' into lane-b/4-1711
lidge-jun commentedon Sep 10, 2026
Closed by #4156, merged to
devas2b1146eeee6c9ea55ea842286c31e7f2bbedc0f4.A per-provider Free only switch now narrows the Dashboard model catalog and the provider workspace inventory before their own search, sort, and page slice, so free rows are not stranded behind Show more on a long OpenRouter list. The classification reads the provider's own published per-token rates and fails closed: a missing, one-sided, non-numeric, or negative rate stays unknown and is never shown as free.
ocx models live --free-onlyreads the same field. The switch is offered only where discovery actually returned prices, and the narrowing lapses if that evidence later disappears, so the list cannot empty behind a control that is no longer on screen.PRs here target
dev, so GitHub does not auto-close the linked issue; this is the manual close with the merge commit as evidence.feat(catalog): classify discovered model pricing and filter free models
docs(devlog): re-split the round-2 lanes after the roadmap audit
feat(catalog): classify discovered model pricing and filter free models
Merge branch 'dev' into lane-b/4-1711