Skip to content

[Feature]: Filter free models in Dashboard catalog (OpenRouter, KiloCode, etc.) #3666

Closed

Description

@nordz0r

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-only

Alternatives 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

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

  1. added
    enhancementNew feature or request
    catalogModel catalog, slugs, visibility, routed entries
    guiDashboard, tray, settings UI
    on Sep 5, 2026
  2. lidge-jun commented on Sep 5, 2026

    @lidge-jun
    Owner

    리뷰 · 우선순위 46 / 80

    이 이슈는 Dashboard 모델 카탈로그에서 OpenRouter·KiloCode처럼 무료/유료가 섞인 공급자 목록을 볼 때, 입력·출력 단가가 둘 다 0인 모델만 빨리 골라 넣는 필터를 요청합니다. 지금은 발견된 모델이 한꺼번에 나오고, 무료 여부를 확인하려면 OpenRouter 가격 페이지나 /api/v1/models의 pricing.prompt / pricing.completion을 따로 대조해야 합니다. 재동기화할 때마다 그 작업을 반복해야 해서, 실험용으로 무료 모델만 쓰고 싶은 사람에게는 실수로 유료를 켜기 쉬운 상태입니다.

    지금 dev HEAD(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 필드가 정답에 가깝습니다. CLI ocx 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 착각과 충돌

    메인테이너의 판단이 필요한 지점

    너의 추천
    help wanted로 두고, 첫 슬라이스는 Dashboard 모델 목록 + 동일 정의의 CLI --free-only만. missing은 제외하고 pricing=0만 free. #3667 GUI가 오면 배지/필터가 오버레이를 읽게 이어서 연결.

    이 댓글은 grok-bot이 작성했습니다

  3. Sfrui commented on Sep 6, 2026

    @Sfrui

    I'd like to take this issue. I traced the current dev data path before starting, and this appears to be a cross-layer change rather than a GUI-only filter:

    • provider /models responses can contain pricing, but catalogHintsFromModelsApiItem() currently drops it;

    • CatalogModel and GET /api/models expose 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-only

    My proposed first PR would:

    1. Derive a strict server-side pricingStatus: "free" | "paid" | "unknown" from provider-reported prompt/input and completion/output prices.
    2. Classify a model as free only 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 remain unknown.
    3. Expose that status through /api/models, so the Dashboard and CLI use the same classification.
    4. Add a free-only toggle to the Dashboard model-management lists and --free-only to ocx models live.
    5. Apply the filter before sorting, pagination, and render limits, and keep counts and empty states accurate.
    6. Add focused discovery, API, GUI, CLI, i18n, and build coverage.

    I would keep manual modelCosts editing (#3667), usage-cost resolution changes, provider-level freeTier, 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 isFree is 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.

  4. lidge-jun commented on Sep 10, 2026

    @lidge-jun
    Owner

    Closed by #4156, merged to dev as 2b1146eeee6c9ea55ea842286c31e7f2bbedc0f4.

    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-only reads 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.

  5. added a commit that references this issue on Sep 10, 2026
    f4fae62
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    catalogModel catalog, slugs, visibility, routed entriesenhancementNew feature or requestguiDashboard, tray, settings UI

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions