mirror of
https://github.com/qingchencloud/clawpanel.git
synced 2026-07-21 04:32:55 +08:00
feat(hermes): add base model config
This commit is contained in:
@@ -58,6 +58,17 @@ test('Hermes 配置页会暴露快捷命令结构化配置字段', () => {
|
||||
}
|
||||
})
|
||||
|
||||
test('Hermes 配置页会暴露基础模型结构化配置字段', () => {
|
||||
for (const id of [
|
||||
'hm-model-config-save',
|
||||
'hm-model-default',
|
||||
'hm-model-provider',
|
||||
'hm-model-base-url',
|
||||
]) {
|
||||
assert.match(source, new RegExp(`id="${id}"`), `缺少 ${id}`)
|
||||
}
|
||||
})
|
||||
|
||||
test('Hermes 配置页会暴露 provider 超时覆盖结构化配置字段', () => {
|
||||
for (const id of [
|
||||
'hm-provider-overrides-save',
|
||||
|
||||
90
tests/hermes-model-config.test.js
Normal file
90
tests/hermes-model-config.test.js
Normal file
@@ -0,0 +1,90 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
|
||||
import {
|
||||
buildHermesModelConfigValues,
|
||||
mergeHermesModelConfig,
|
||||
} from '../scripts/dev-api.js'
|
||||
|
||||
test('Hermes 基础模型配置读取会提供默认值并兼容 model.model', () => {
|
||||
assert.deepEqual(buildHermesModelConfigValues({}), {
|
||||
modelDefault: '',
|
||||
modelProvider: 'auto',
|
||||
modelBaseUrl: '',
|
||||
})
|
||||
|
||||
const values = buildHermesModelConfigValues({
|
||||
model: {
|
||||
model: 'anthropic/claude-sonnet-4-6',
|
||||
provider: 'openrouter',
|
||||
base_url: 'https://openrouter.ai/api/v1',
|
||||
},
|
||||
})
|
||||
|
||||
assert.deepEqual(values, {
|
||||
modelDefault: 'anthropic/claude-sonnet-4-6',
|
||||
modelProvider: 'openrouter',
|
||||
modelBaseUrl: 'https://openrouter.ai/api/v1',
|
||||
})
|
||||
})
|
||||
|
||||
test('Hermes 基础模型配置保存会保留未知字段并写入 model.default/provider/base_url', () => {
|
||||
const next = mergeHermesModelConfig({
|
||||
model: {
|
||||
default: 'old-model',
|
||||
provider: 'auto',
|
||||
base_url: 'https://old.example/v1',
|
||||
auth_mode: 'env',
|
||||
context_length: 200000,
|
||||
},
|
||||
memory: { memory_enabled: true },
|
||||
}, {
|
||||
modelDefault: 'anthropic/claude-opus-4.6',
|
||||
modelProvider: 'openrouter',
|
||||
modelBaseUrl: 'https://openrouter.ai/api/v1',
|
||||
})
|
||||
|
||||
assert.deepEqual(next.memory, { memory_enabled: true })
|
||||
assert.equal(next.model.default, 'anthropic/claude-opus-4.6')
|
||||
assert.equal(next.model.provider, 'openrouter')
|
||||
assert.equal(next.model.base_url, 'https://openrouter.ai/api/v1')
|
||||
assert.equal(next.model.auth_mode, 'env')
|
||||
assert.equal(next.model.context_length, 200000)
|
||||
})
|
||||
|
||||
test('Hermes 基础模型配置保存空 base_url 会删除该字段但保留 model 其它字段', () => {
|
||||
const next = mergeHermesModelConfig({
|
||||
model: {
|
||||
default: 'old-model',
|
||||
provider: 'custom',
|
||||
base_url: 'https://old.example/v1',
|
||||
max_tokens: 8192,
|
||||
},
|
||||
display: { language: 'zh' },
|
||||
}, {
|
||||
modelDefault: 'google/gemini-3-flash-preview',
|
||||
modelProvider: 'auto',
|
||||
modelBaseUrl: ' ',
|
||||
})
|
||||
|
||||
assert.equal(next.model.default, 'google/gemini-3-flash-preview')
|
||||
assert.equal(next.model.provider, 'auto')
|
||||
assert.equal(Object.hasOwn(next.model, 'base_url'), false)
|
||||
assert.equal(next.model.max_tokens, 8192)
|
||||
assert.deepEqual(next.display, { language: 'zh' })
|
||||
})
|
||||
|
||||
test('Hermes 基础模型配置保存会拒绝空模型和字段类型错误', () => {
|
||||
assert.throws(
|
||||
() => mergeHermesModelConfig({}, { modelDefault: ' ', modelProvider: 'auto' }),
|
||||
/model\.default/,
|
||||
)
|
||||
assert.throws(
|
||||
() => mergeHermesModelConfig({}, { modelDefault: 'gpt-5', modelProvider: 123 }),
|
||||
/model\.provider/,
|
||||
)
|
||||
assert.throws(
|
||||
() => mergeHermesModelConfig({}, { modelDefault: 'gpt-5', modelProvider: 'auto', modelBaseUrl: 123 }),
|
||||
/model\.base_url/,
|
||||
)
|
||||
})
|
||||
Reference in New Issue
Block a user