5.7 KiB
description, kind
| description | kind |
|---|---|
| Model selection for the Web GUI: the /model popup and the composer model seat over one per-session provider-grouped directory; for users and maintainers of model routing. | package-reference |
@deepseek-ai/dsh-client-ui-model-selection
English | 中文
Summary
This package provides model selection in the Web GUI: the /model popup command and the composer's model seat, both over one per-session directory of provider-grouped models. Choosing a model submits the complete selection — provider, model, and reasoning effort — which the Host snapshots at the next prompt-assembly boundary, so the following request uses it while a running step keeps its assembled selection. The composer seat shows a two-level Model/Effort menu: models stay provider-grouped, and the selected exact model supplies its adapter-owned effort names and default. When the Host reports that no adapter serves the session's route, the composer input goes inert until a route becomes available.
Table of Contents
- Use this package
- Understand the implementation
- Further Exploration
- Model Experience
- Known Limitations and Deferred Work
- Dev Note
Use this package
Mount this plugin alongside ui-conversation and the commands package; the composer then shows the model seat next to the pending indicator, and /model opens the same directory as a popup. Both surfaces show the host-reported current selection when the exact provider/model pair remains in the advertised groups; a missing catalog row leaves the routable selection intact while the trigger prompts Select model.
Model and effort
Models stay grouped by provider. The menu shows model and effort names only; catalog descriptions remain available to other consumers. The /model popup applies the selected model's default effort; the composer can then choose any advertised effort. An adapter without reasoning metadata leaves the Effort row absent; there is no arbitrary effort input.
Unroutable sessions
When the Host reports that no adapter serves the session's route, this plugin raises a composer block and the input goes inert with its own copy; recovering clears it without a reload. A null before the first load or after one failed never blocks, and catalog membership never blocks either — a route serving a model it does not advertise is missing from the groups yet usable.
Understand the implementation
Implementation internals — click to expand
Two entries over ONE per-session directory owned by ModelDirectoryResolver (ctx.modelDirectories): the /model popupSelect contribution (registered through ctx.commandUi) and the composer's named conversation.input.model seat both load the session's advisory directory through session.models and submit through session.selectModel via the same ModelDirectory instance, so a switch made in either entry is what the other shows next. Directory loads and selections share a generation counter so an older response never overwrites a newer one; a connection reset drops every resident projection and repulls the Host-restored selection. Directories are per-session, resolved lazily, and disposed with the session scope; addressed subagent sessions expose neither entry. Every resident directory refetches directly on forwarded llm/adapters-updated and settings/document-updated owner events.
Further Exploration
Read these pages when the model surface is not enough. They move from the browser surfaces to the command popup shell and the selection contract.
- ui-commands — the popupSelect shell the
/modelcontribution registers into. - ui-conversation — declares the composer's
conversation.input.modelseat and the composer block. - dsh-agent-default-model — the default-model service for sessions that never choose.
- Client package map — adjacent browser UI packages.
Model Experience
Indirectly, through the session.selectModel selection both entries submit: the Host snapshots the complete ModelSelection at the next prompt-assembly boundary and owns the model-visible effect, while a running step keeps its assembled selection.
KV Cache effect
Switching the route can reduce or invalidate provider-side cache reuse for subsequent requests; the prompt prefix itself is untouched.
Known Limitations and Deferred Work
These limits define the current model surface. They are current package constraints, not a general model-router comparison or a task backlog.
- No create-time or addressed-subagent selection — both entries require an existing ordinary session's Agent; there is no draft-phase model choice to fold into session creation, and subagent continuation deliberately exposes no independent model-selection contract.
- Directory names are presentation-only — selection and persistence use provider/model/effort ids; a provider whose catalog or exact-model metadata lookup fails lists as an unselectable failure row until reload.
- No arbitrary effort input — the composer offers only the exact model's adapter-advertised levels; an adapter without reasoning metadata leaves the Effort row absent.
Dev Note
Working context for maintainers — click to expand
None.