跳转到内容

模型选择器 ModelSelector

ModelSelector 适用于模型数量较多、需要按厂商或能力检索的选择场景。它由状态根组件、对话框、搜索框、列表和展示原语组成,可以按业务数据自由组合,而不要求把模型目录写死在组件内部。

组件内部直接复用 SD Design 的 ButtonModalInputScrollbarEmptyDivider,因此会继承组件库统一的尺寸、禁用态、焦点样式、滚动条与空状态表现。ModelSelector 只补充模型筛选、选项注册、键盘导航和 Logo 组合等领域能力。

所有内置服务商 Logo 都会随 @sdata/web-vue 一起打包。组件运行时不会访问 models.dev、CDN 或其他图片服务;未知 provider 会使用同样位于包内的通用 SVG。

使用 ModelSelector 管理显隐与选择事件,通过 ModelSelectorTriggerModelSelectorContent 和列表子组件组合完整选择流程。ModelSelectorItemlabelkeywords 都会参与搜索。

搜索不区分大小写,会匹配选项值、labelkeywords。过滤后没有可见选项的分组会自动隐藏,所有分组均为空时显示 ModelSelectorEmpty

ModelSelectorDialog 是无需单独声明根组件和 Content 的便捷入口,支持 v-model:visible。选择后默认关闭;若需要连续选择,可设置 close-on-select="false"

自定义触发组件、分组与模型路由

Section titled “自定义触发组件、分组与模型路由”

ModelSelectorTrigger 的默认插槽可以直接放置任意 Vue 组件或原生元素;组件会把触发事件、样式类和显隐 ARIA 属性合并到插槽中的第一个有效节点,不会额外包裹 Button。纯文本内容仍使用默认 Button 渲染。示例使用 Tag 作为触发组件,并通过插槽参数同步打开状态。

分组标题、选项内容和模型名称同样由插槽组合。ModelSelectorLogoGroup 会排列在名称右侧,可展示多个候选服务商;自定义 provider 不会触发远程图片请求,而是使用离线通用 Logo。通过 ModelSelectorItemshortcut 属性可以为每个选项配置适合当前应用的快捷键。

按键 行为
/ 在当前搜索结果的可用选项间循环移动
Enter 选择当前活动项
Esc 关闭模型选择器
Tab / Shift + Tab 在对话框内按焦点顺序移动
选项的 shortcut 直接选择对应的可用选项

选项快捷键基于 VueUse useMagicKeys,使用 Alt+Shift+1Ctrl+KMeta+1 等组合键格式。数字键会按 KeyboardEvent.code 匹配,因此 Alt+Shift+1 中数字键产生 ! 时仍可正确识别。快捷键只在选择器打开时生效,并且只会选择当前搜索结果中可见且未禁用的选项。若组合键与操作系统或其他软件冲突,可通过每个 ModelSelectorItemshortcut 属性替换。

ModelSelectorLogo 内置 MODEL_SELECTOR_PROVIDERS 中列出的 provider。资源来自 models.dev 的开源 provider logo 数据,并已固化为组件源码中的 SVG。wandbsyntheticrequestymorphlmstudio 在上游没有独立 Logo,与上游服务一致使用本地通用图标。

可以从包中导入 provider 类型和已知列表:

import type { ModelSelectorProvider } from '@sdata/web-vue';
import { MODEL_SELECTOR_PROVIDERS } from '@sdata/web-vue';

ModelSelectorProvider 保留已知值的自动补全,同时允许业务自定义字符串;自定义值始终离线回退。

参数 描述 类型 默认值
visible (v-model) 是否显示选择器 boolean -
default-visible 非受控模式的默认显隐状态 boolean false
close-on-select 选择后是否自动关闭 boolean true
reset-query-on-close 关闭时是否清空搜索条件 boolean true
事件 描述 参数
visible-change 显隐状态改变时触发 (visible: boolean)
select 用户选择可用项时触发 (value: string, event: Event)
插槽 描述 参数
default 触发器与选择器内容 { visible, open, close }
参数 描述 类型 默认值
disabled 是否禁用触发器 boolean false

默认插槽接收 { visible, disabled, open, close }。插槽只有纯文本时使用默认 Button;存在元素或组件时,该节点会直接作为触发元素,并自动接收 sd-model-selector-triggeraria-haspopuparia-expandedaria-disableddisabled 与点击行为。自定义非交互元素时,使用者仍需补充适合业务语义的 roletabindex 和键盘行为。

参数 描述 类型 默认值
title 对话框无障碍标题 string '模型选择'
width 对话框宽度 number | string 640
render-to-body 是否挂载到 body boolean true
unmount-on-close 关闭时是否卸载内容 boolean true
mask-closable 点击遮罩是否关闭 boolean true
esc-to-close 是否允许 Esc 关闭 boolean true

默认插槽用于组合输入框、列表及其他自定义内容。标题在视觉上隐藏,但会作为对话框的可访问名称保留。

ModelSelectorDialog 同时接受 ModelSelectorvisibledefault-visibleclose-on-selectreset-query-on-close,以及 ModelSelectorContent 的全部 props。它同样触发 visible-changeselect

参数 描述 类型 默认值
model-value (v-model) 搜索内容;未绑定时使用根组件内部状态 string -
input-attrs 透传给底层原生 input 的属性 object -

组件基于 Inputplaceholderdisabledreadonlysizeallow-clear 等 Input 属性可直接使用;需要设置原生输入属性时使用 input-attrs。输入框自动关联列表的 aria-controls 和活动项的 aria-activedescendant

参数 描述 类型 默认值
heading 分组标题,heading 插槽优先 string -
插槽 描述
default 分组内的模型选项
heading 自定义分组标题
参数 描述 类型 默认值
value 选择事件返回的值 string -
label 用于搜索的显示文本;省略时读取渲染文本 string -
keywords 额外搜索关键词 string[] []
disabled 是否禁用 boolean false
selected 是否展示为已选状态 boolean false
shortcut 选择当前选项的组合键,格式遵循 VueUse useMagicKeys string -
事件 描述 参数
select 当前选项被选择时触发 (value: string, event: Event)

默认插槽接收 { active, disabled, selected },可用于自定义勾选图标或活动态内容。

组件 用途 Props
ModelSelectorList 基于 Scrollbar 的可滚动 listbox 容器 -
ModelSelectorEmpty 基于 Empty,无匹配选项时自动显示 -
ModelSelectorSeparator 基于 Divider 分隔不同区域 -
ModelSelectorShortcut 展示快捷键提示 -
ModelSelectorName 带省略处理的模型名称 -
ModelSelectorLogoGroup 重叠展示多个服务商 Logo -
参数 描述 类型 默认值
provider 服务商标识,未知值使用离线通用 Logo ModelSelectorProvider -
alt 图片替代文本 string `${provider} logo`
width Logo 宽度 number | string 16
height Logo 高度 number | string 16

其余属性会透传给原生 img