优化: 供应商级采样温度覆盖配置

受限模型(经路由透传)仅接受特定 temperature 其它值 400;
provider config JSON 带 temperature 字段则覆盖默认,未配置走 0.7,设置页可编辑。
This commit is contained in:
lxy
2026-09-29 13:33:49 +08:00
parent 7cb32d1380
commit 378c363632
5 changed files with 155 additions and 17 deletions
+25
View File
@@ -101,6 +101,12 @@
Gemini 2.5→3.5 等),提示用户点「测试连接」拉真实模型列表覆盖,降低踩过时默认值的困惑。 -->
<div class="form-field-hint">{{ $t('settings.defaultModelHint') }}</div>
</div>
<!-- 供应商级采样温度覆盖:部分受限模型(如 Kimi 系)仅接受 temperature=1,留空走默认 0.7 -->
<div class="form-field">
<label class="form-label">{{ $t('settings.labelSamplingTemp') }}</label>
<input type="number" v-model.number="providerForm.temperature" class="setting-input"
:placeholder="$t('settings.phSamplingTemp')" step="0.1" min="0" max="2" />
</div>
<!-- P0-2: 保存失败持久错误横幅(常驻表单内,非自隐 toast)。
含分类建议:keyring/迁移失败 → 查系统钥匙串权限;其它 → 通用重试。
用户看到错误同时表单保持编辑态,改完点保存即可重试。 -->
@@ -221,6 +227,8 @@ const providerForm = reactive({
baseUrl: '',
apiKey: '',
defaultModel: '',
// 供应商级采样温度覆盖(null=未配置,保存不带该参,主链路走默认 0.7;清空输入可能残留 '' ,保存时防御过滤)
temperature: null as number | null,
// 项 D:厂商预设下拉当前值(__custom=自定义;命中预设 id 时仅作展示与回填源头,
// 实际字段值由 onPresetChange 写入;用户手改任一字段后 presetId 不自动复位,
// 避免编辑态抖动,提交时也不读 presetId —— 以表单实际字段值为准)。
@@ -286,6 +294,7 @@ function formBusinessSnapshot(): string {
baseUrl: providerForm.baseUrl,
apiKey: providerForm.apiKey,
defaultModel: providerForm.defaultModel,
temperature: providerForm.temperature,
models: providerForm.models.map(m => ({
model_id: m.model_id,
enabled: m.enabled,
@@ -385,6 +394,16 @@ function openProviderForm(p?: AiProviderConfig) {
providerForm.apiKey = '' // 编辑不回填 api_key(list 返回 mask,留空=不改,FR-S1)
providerForm.defaultModel = p.default_model
providerForm.providerType = p.provider_type || 'openai_compat'
// 从 config JSON 解析采样温度回显(config 可能为 null/非法 JSON,防御处理兜底 null)
providerForm.temperature = (() => {
try {
const cfg = p.config ? JSON.parse(p.config) : null
const tv = cfg?.temperature
return typeof tv === 'number' && Number.isFinite(tv) ? tv : null
} catch {
return null
}
})()
// 项 D:编辑态不反推预设(避免用户已手改 baseUrl/model 却被下拉误标成某预设误导);
// 统一标"自定义",下拉仅作新建快捷填充入口。
providerForm.presetId = CUSTOM_PRESET_ID
@@ -399,6 +418,7 @@ function openProviderForm(p?: AiProviderConfig) {
providerForm.defaultModel = ''
providerForm.presetId = CUSTOM_PRESET_ID
providerForm.models = []
providerForm.temperature = null
}
providerForm.fetching = false
providerForm.saveError = null // 重开表单清旧错误横幅
@@ -525,6 +545,11 @@ async function saveProvider() {
apiKey: providerForm.apiKey,
defaultModel: providerForm.defaultModel,
modelConfigs: providerForm.models,
// 采样温度非空且为有效数字才带(清空输入 v-model.number 可能残留 ''/NaN,不过滤会污染后端 config)
temperatureOverride:
typeof providerForm.temperature === 'number' && Number.isFinite(providerForm.temperature)
? providerForm.temperature
: undefined,
})
// 成功明确反馈——清错误横幅 + 关表单 + 绿色「已保存」toast
providerForm.saveError = null
+2
View File
@@ -49,6 +49,8 @@ export default {
labelBaseUrl: 'Base URL',
labelApiKey: 'API Key',
labelDefaultModel: 'Default',
labelSamplingTemp: 'Sampling temperature',
phSamplingTemp: 'default 0.7',
phProviderName: 'e.g. DeepSeek, GLM-4',
phBaseUrl: 'https://api.deepseek.com',
phApiKey: 'sk-...',
+2
View File
@@ -49,6 +49,8 @@ export default {
labelBaseUrl: 'Base URL',
labelApiKey: 'API Key',
labelDefaultModel: '默认模型',
labelSamplingTemp: '采样温度',
phSamplingTemp: '默认 0.7',
phProviderName: '如 DeepSeek、GLM-4',
phBaseUrl: 'https://api.deepseek.com',
phApiKey: 'sk-...',