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/, ) })