|
| 1 | +# 供应商与模型表单:Preset 与自动填充 |
| 2 | + |
| 3 | +**文档性质**:描述「添加/编辑 **Provider**」与「添加/编辑 **Model**」时,**什么会被自动带出**、**什么必须尊重用户已填内容**;供产品验收与需求变更对照。 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## 1. 术语(概念英文名优先) |
| 8 | + |
| 9 | +| 用户可见说法 | 概念(英文) | 说明 | |
| 10 | +|--------------|--------------|------| |
| 11 | +| 供应商标识 | **Provider ID** | 唯一标识一条 Provider。 | |
| 12 | +| 供应商展示名 | **Display name** | 仅展示。 | |
| 13 | +| 接口类型 | **API type** | OpenAI-compatible 与 Anthropic-compatible 二选一。 | |
| 14 | +| 服务根地址 / 路径 | **Base URL** / **Endpoint** | 共同决定实际请求落点;二者组合为完整 **Service URL**(产品表述可用「完整 URL」)。 | |
| 15 | +| 官网 | **Website** | 可选。 | |
| 16 | +| 密钥 | **API Key** | 可选;用于检测与部分请求。 | |
| 17 | +| 模型标识 / 展示名 | **Model ID** / **Model display name** | 模型在列表与导出中的主键与展示。 | |
| 18 | +| 能力与参数 | **Model params**(如上下文长度、输出上限、推理、输入类型等) | 可选扩展信息。 | |
| 19 | + |
| 20 | +--- |
| 21 | + |
| 22 | +## 2. Preset 从哪来、起什么作用 |
| 23 | + |
| 24 | +- **Provider preset**:按供应商给出的默认展示名,以及**按 API type 分组的**默认 **Base URL / Endpoint**。 |
| 25 | +- **Model preset**:按模型给出的建议展示名与常见能力字段。 |
| 26 | +- **历史复用**:用户曾在本地保存过的 **Model ID** 也可进入候选,便于跨项目复用标识。 |
| 27 | +- **URL 片段建议**:常见 **Base URL**、**Endpoint** 片段来自内置汇总与 Preset 去重合并,供下拉快速选择。 |
| 28 | + |
| 29 | +以上均服务于**降低首次配置成本**;不替代用户对真实服务端点的确认责任。 |
| 30 | + |
| 31 | +--- |
| 32 | + |
| 33 | +## 3. Provider 表单行为 |
| 34 | + |
| 35 | +### 3.1 打开时 |
| 36 | + |
| 37 | +- **新建**:空表或默认值;**不**在标识为空时「猜一整张供应商」。 |
| 38 | +- **编辑**:与已保存记录一致。 |
| 39 | + |
| 40 | +### 3.2 自动填充的匹配键(核心规则) |
| 41 | + |
| 42 | +对 **Provider** 一侧,凡是根据 **Provider preset** 写入 **Base URL / Endpoint**(以及必要时 **API type**)时,逻辑都建立在两个键上: |
| 43 | + |
| 44 | +1. **Provider ID**:在预设目录中命中哪一条供应商(或判定无命中)。 |
| 45 | +2. **API type**:在已命中的那条预设里,选用**哪一组**默认连接信息——**必须优先对应当前界面上已选择的 API type**。 |
| 46 | + |
| 47 | +直观表述:**同一 Provider ID 下,OpenAI-compatible 与 Anthropic-compatible 可以对应不同的 Base URL / Endpoint**;自动填充时不是只「认供应商名」,而是 **Provider ID + API type** 一起决定填哪一组 **Base URL / Endpoint**。若预设里只为某一种 API type 配了连接信息,则只在用户当前选中该 type(或回落到预设中的第一组可用连接)时写入,避免把另一类型的地址套到当前类型上。 |
| 48 | + |
| 49 | +**Website** 与 **API Key** 不因上述自动填充被覆盖,除非用户自行编辑。 |
| 50 | + |
| 51 | +--- |
| 52 | + |
| 53 | +### 3.3 Provider ID 输入框失焦(且标识非空) |
| 54 | + |
| 55 | +- **无匹配 Preset**:只补**展示名**(由标识格式推导可读名称),**不**自动写入 **Base URL / Endpoint** 或 **API type**。 |
| 56 | +- **有匹配 Preset**: |
| 57 | + - 写入 Preset 中的**展示名**。 |
| 58 | + - **Base URL / Endpoint**(及必要时 **API type**):在预设里查找与**失焦瞬间界面上已选择的 API type** 一致的那一组默认连接;若该 type 在预设中有独立配置,则使用这一组;若预设未按 type 拆分、或该 type 没有单独一组,则使用预设中的**第一组**默认连接(前提是该组为「有效连接」,见第 6 节)。 |
| 59 | + - 若预设中**没有任何一组有效连接**(见第 6 节):**只**补展示名,**不得**把 **Base URL / Endpoint** 写成空串去覆盖用户已填内容,也**不得**在无有效依据时乱改 **API type**。 |
| 60 | + |
| 61 | +--- |
| 62 | + |
| 63 | +### 3.4 从下拉列表点选某条预设供应商 |
| 64 | + |
| 65 | +与 **3.3 失焦** 规则一致:以**点选瞬间界面上已选择的 API type** 为准,去命中 **Provider ID** 对应预设里「该 API type 下的一组 **Base URL / Endpoint**」;若无该 type 的独立配置,则按预设内约定回落到第一组有效连接。 |
| 66 | +**Website** / **API Key** 仍不因点选而被动覆盖。 |
| 67 | + |
| 68 | +--- |
| 69 | + |
| 70 | +### 3.5 用户切换 API type(两种接口互切) |
| 71 | + |
| 72 | +- 界面上的 **API type** 立即变为用户新选的一种。 |
| 73 | +- **仅当**当前 **Provider ID** 在预设中存在,且预设里**存在与新选 API type 对应的一组「有效」默认连接**时,才用这一组去更新 **Base URL / Endpoint**。 |
| 74 | +- 若预设**没有**为新选的 API type 配置连接,或该组为无效空连接:则**只更新 API type**,用户已填的 **Base URL / Endpoint 保持不变**(不得用空预设行覆盖)。 |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +### 3.6 Base URL / Endpoint 的其它来源 |
| 79 | + |
| 80 | +这两项没有独立于上述规则的「再算一遍」逻辑;其余来源仅为:**用户手输**、或 **URL 片段建议**下拉(由内置汇总与 Preset 合并而来)。二者拼成完整 **Service URL**。 |
| 81 | + |
| 82 | +--- |
| 83 | + |
| 84 | +## 4. Model 表单行为 |
| 85 | + |
| 86 | +### 4.1 打开时 |
| 87 | + |
| 88 | +- **新建**:不预填模型标识与参数。 |
| 89 | +- **编辑**:与已保存一致。 |
| 90 | + |
| 91 | +### 4.2 模型 ID 候选如何排序 |
| 92 | + |
| 93 | +- 若能将当前 Provider 与某条 **Provider preset** 对上号:优先展示**同一供应商生态**下的 **Model preset**,其余排在后面。 |
| 94 | +- 对不上:按内置顺序展示全部 **Model preset**。 |
| 95 | +- 候选中同时包含:**排序后的 Preset 模型 ID** 与**本地已出现过的、未被子列表覆盖的**历史 **Model ID**。 |
| 96 | + |
| 97 | +### 4.3 何时触发自动填充 |
| 98 | + |
| 99 | +- **失焦**:在「当前排序下的 Preset 列表」中匹配第一个与输入一致的模型,用于补全。 |
| 100 | +- **从下拉点选一项**:仅对该项做匹配;若无对应 Preset,只更新 **Model ID** 本身。 |
| 101 | + |
| 102 | +### 4.4 自动填充的尊重原则 |
| 103 | + |
| 104 | +- **展示名**:仅在用户未填写时,用 Preset 补全;已填写则不覆盖。 |
| 105 | +- **能力参数**:在保留用户已填项的前提下,用 Preset 中有值的项**补空或补强**;Preset 无值的项不强行覆盖。 |
| 106 | +- **无数**:不改动其它字段。 |
| 107 | + |
| 108 | +--- |
| 109 | + |
| 110 | +## 5. 保存时 |
| 111 | + |
| 112 | +保存只做必填校验与写入当前表单;**不会**在保存瞬间再次合并 Preset。自动填充只发生在编辑过程中的输入、选择与切换。 |
| 113 | + |
| 114 | +**保存 Model 时**:新建或编辑保存后,该条模型的**连通性测试状态会重置为待测**(`pending`),并**清空**上次测试时间与信息(见 [08-data-model-and-persistence.md](08-data-model-and-persistence.md) §10)。 |
| 115 | + |
| 116 | +--- |
| 117 | + |
| 118 | +## 6. 产品规则:有效连接与防误伤(与第 3 节配套) |
| 119 | + |
| 120 | +第 3.3–3.5 中凡提到「有效连接」「不得用空串覆盖」处,均以下列定义为准;验收时应与第 3 节一起覆盖。 |
| 121 | + |
| 122 | +下列规则用于避免「清空用户已填」或「API type 与连接信息不一致」的体验问题。 |
| 123 | + |
| 124 | +**何谓「一组有效的连接默认值」** |
| 125 | +Preset 里某一 API type 对应的一行:在去掉首尾空白后,**Base URL 与 Endpoint 至少一端非空**,才视为有效;全空白不算有效。 |
| 126 | + |
| 127 | +**当 Preset 没有任何有效连接默认值时** |
| 128 | +只能补展示名(或无 Preset 时的标识推导名),**不得**写入或清空 **API type / Base URL / Endpoint** 中的任一项为「空串占位」。 |
| 129 | + |
| 130 | +**当用户选的 API type 在 Preset 里对应行无效,但其它类型有有效行时** |
| 131 | +**不得**自动改用其它类型的连接信息来「凑数」,否则会造成 **API type** 与用户意图不一致;此时应退化为**只保证展示名类字段**。 |
| 132 | + |
| 133 | +**切换 API type 时** |
| 134 | +仅当新类型在 Preset 中存在**有效**默认连接时,才覆盖 **Base URL / Endpoint**;否则保留用户当前填写。 |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +## 7. 文档维护 |
| 139 | + |
| 140 | +若线上行为与本文冲突,应以**已发布产品行为**为准,并回写本文与相关需求说明。 |
0 commit comments