Skip to content

[Feature] Allow visual drag-and-drop reordering for modelPickerOrder in Web GUI #3774

Closed

Description

@leonclab

Ordering presets landed; drag-and-drop remains open

#3801 (8615f1a1c9) adds picker-order presets and saves them without replacing featured selections. Free-form drag-and-drop and the requested native/featured-row behavior remain outstanding.

Verified against dev 5759d9ea2f1e7281cdc01eb9628f2e0a123fb59c. Original report by @leonclab. The attribution record was added in #3811.

Area

Dashboard

What are you trying to accomplish?

In Codex Desktop, when users configure multiple models across different providers (native OpenAI, OpenCode-Go, Google Antigravity, or custom forward proxies), the display order in the model picker is dominated by subagentModels priority calculation (priority = 0..N-1), while non-featured models are placed arbitrarily.

I need a convenient way in the OpenCodex Web GUI to visually reorder enabled models so that users can organize the Codex Desktop model picker (e.g. keep native OpenAI models on top, followed by cleanly grouped provider sections) without manually editing JSON configuration files.

What prevents this today?

Currently, customizing the model picker display order requires manually crafting the modelPickerOrder array inside ~/.opencodex/config.json. This requires knowing internal model slugs (e.g., provider/model-id), checking catalog priority calculations, and manually restarting or syncing the service. It is error-prone and not accessible from the Web GUI.

What should OpenCodex do?

  1. In the Models management tab of the Web GUI, provide drag-and-drop handles for all enabled models to visually adjust their display order.
  2. Provide a quick action button (e.g., "Group by Provider") that clusters models by their upstream provider (e.g., native OpenAI first, then sorted by provider namespaces).
  3. When the order is changed, save the list directly to config.modelPickerOrder via the existing /api/config endpoint and trigger catalog synchronization.

Example usage or interface

  1. Open Web GUI -> Models.
  2. Drag google-antigravity/gemini-3.8-flash above another provider row, or click "Group by Provider".
  3. The GUI sends a PATCH/PUT to /api/config with {"modelPickerOrder": ["gpt-5.6-sol", "gpt-5.6-luna", "OG/...", "google-antigravity/..."]}.
  4. OpenCodex triggers syncModelsToCodex() and Codex Desktop reflects the new picker order.

Alternatives or workarounds

Manually editing ~/.opencodex/config.json and adding a large modelPickerOrder string array by hand.

Additional context

The underlying priority reordering engine modelPickerOrder is already supported in src/codex/catalog/sync.ts (around line 520). Exposing this to the Web GUI would make model ordering much more user-friendly.

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. lidge-jun commented on Sep 6, 2026

    @lidge-jun
    Owner

    리뷰 · 우선순위 48 / 80

    이 이슈는 Web GUI Models 탭에서 활성화된 모델을 드래그 앤 드롭으로 재배열하고, “프로바이더별 묶기” 같은 빠른 동작으로 config.modelPickerOrder를 저장·동기화해 Codex Desktop 피커 순서를 바꾸자는 기능 요청입니다. 지금은 ~/.opencodex/config.json에 slug 배열을 손으로 써야 하고, subagentModels 우선순위와 섞여 보이기 쉬운 상태입니다. 엔진 자체는 이미 있습니다. src/types/config.ts에 modelPickerOrder?: string[]가 있고, src/codex/catalog/sync.ts는 디스플레이 전용 우선순위로 비피처 행을 재배열합니다(주석·헬퍼 대략 L90–L97, L523 근처). src/codex/convergence.ts도 설정값을 sync로 넘깁니다. 즉 “저장 키와 카탈로그 반영”은 되어 있고, 부족한 쪽은 GUI 조작감입니다.

    다만 같은 목표를 이미 열린 PR이 상당 부분 가져가고 있습니다. #3383(feat(models): add main picker ordering controls, 아직 OPEN)은 gui/src/model-picker-order.ts와 gui/src/pages/Models.tsx에 Default / A-Z / 프로바이더별 / Most used 모드를 두고, 선택한 순서를 modelPickerOrder에 저장하며, subagentModels·서브에이전트 라우팅은 건드리지 않는다고 명시합니다. 이슈가 요청한 “Group by Provider”는 #3383의 provider 모드와 거의 같고, /api/config 저장·sync 흐름도 그 PR 범위에 들어 있습니다. 이 이슈만의 추가분은 자유 드래그 앤 드롭으로 custom 순서를 직접 편집하는 UX에 가깝습니다. 현재 dev HEAD bd1cda99c의 Models 페이지에는 아직 그 드래그 핸들이 없고, #3383도 모드 프리셋 중심이라 DnD는 후속일 가능성이 큽니다.

    release-244(#3768 credential 선택 공유) 기준으로는 블로커가 아닙니다. GUI 편의 기능이고, 엔진·문서(docs-site/.../model-ordering.md가 #3383에 포함)가 이미 정리 중입니다. types/config 분할로 무효화될 성격도 아닙니다. 다만 새 GUI PR을 지금 병렬로 받으면 Models.tsx 충돌과 “피커 순서” 제품 메시지가 두 갈래로 갈라집니다. 우선순위는 중간 이하로 두고, #3383에 붙이거나 그 PR 머지 후 DnD만 후속으로 받는 편이 맞습니다.

    경로 src/codex/catalog/sync.ts modelPickerOrder / normalizeModelPickerOrder - 디스플레이 전용 엔진은 이미 있음. GUI만 없으면 이슈 전부가 아님
    경로 src/types/config.ts modelPickerOrder - 저장 스키마는 이미 존재
    경로 gui/src/pages/Models.tsx (dev HEAD) - 드래그 핸들·순서 저장 UI 없음. 이슈의 핵심 갭
    경로 PR #3383 gui/src/model-picker-order.ts - provider/alphabetical/most-used 프리셋이 이슈의 “Group by Provider”와 겹침
    경로 PR #3383 management/config 저장 경로 - modelPickerOrder를 subagent 라우팅과 분리해 저장하려는 설계가 이슈 요구와 맞음
    심볼 subagentModels vs modelPickerOrder - 이슈 본문이 둘을 섞어 설명하므로, GUI 카피에서 “피커 표시 순서만”을 더 분명히 해야 함

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

    • 이 이슈를 #3383 중복/후속으로 닫고 DnD만 새 이슈로 남길지, #3383에 드래그 핸들을 이어서 넣을지
    • 네이티브 모델·routed 모델·featured 행을 같은 DnD 리스트에 둘지, sync 규칙상 featured/natural priority 대역은 드래그 불가로 둘지
    • “Group by Provider”만으로 충분한지, 아니면 custom 모드 DnD가 반드시 필요한지(모바일 GUI 포함)
    • /api/config 패치 후 syncModelsToCodex()를 GUI가 항상 기다릴지, 기존 catalog refresh 신호를 재사용할지

    너의 추천
    새 병렬 PR은 받지 마세요. 먼저 #3383을 리뷰·머지하고, 이 이슈는 그 PR에 링크한 뒤 “머지 후 남는 갭 = 드래그 앤 드롭 custom 편집”만 남기거나 #3383에 DnD를 작은 후속 커밋으로 붙이세요. 엔진·설정 키를 다시 만들지 말고, 기존 modelPickerOrder와 sync 디스플레이 대역 규칙을 그대로 쓰세요. release-244 블로커로 올리지 않는 것을 추천합니다.

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

  2. lidge-jun commented on Sep 7, 2026

    @lidge-jun
    Owner

    Partial: drag-and-drop reordering for modelPickerOrder landed on dev via #3887 (merge 1e188b787, Co-authored-by: leonclab) on top of the ordering presets from #3801 — pointer drag and keyboard (Enter) moves, exact PUT fields, save/reload, failed-save draft preservation, native rows locked. Remaining for this issue: reordering of native/featured rows and any further UX polish, so it stays open.

  3. lidge-jun commented on Sep 18, 2026

    @lidge-jun
    Owner

    Already shipped. #3887 landed as 1e188b7874b1bfe6539e85fa91ba2d4ad12ca9eb — "feat(gui): add guarded routed model picker drag ordering" — and its merge commit names this issue as the slice it carries.

    Closing it because the status here is stale rather than because the request was declined: drag ordering for modelPickerOrder is in the WebUI and has been for some time. This surfaced while auditing the open backlog against what is actually on dev, which is exactly the kind of drift that makes an issue list less useful than it should be.

    If the shipped behaviour differs from what you had in mind — the guard conditions, which rows are draggable, or how the order persists — that is worth a fresh issue naming the specific gap, since it would be a different request from this one and easier to act on than reopening a thread whose original ask is satisfied.

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

    enhancementNew feature or requestguiDashboard, tray, settings UI

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions