fix: track agent config changes and health-check selected models only
This commit is contained in:
1 parent
4d32f58ee2
commit
02c6fac72a
8 files changed
+180
-59
No files matched your search
@@ -8,6 +8,10 @@ import {
|
||||
resolveAgentModelForAliasMode,
|
||||
resolveAgentModelSelection,
|
||||
} from '../src/services/agentModelPicker';
|
||||
import {
|
||||
resolveAgentConfigurationAction,
|
||||
type AgentConfigurationClientId,
|
||||
} from '../src/services/agentConfigurationDraft';
|
||||
|
||||
const models = [
|
||||
{ name: 'claude-sonnet-4-5', alias: 'Sonnet' },
|
||||
@@ -69,3 +73,57 @@ describe('智能体模型选择器', () => {
|
||||
expect(resolveAgentModelForAliasMode([], 'gpt-original', true)).toBe('');
|
||||
});
|
||||
});
|
||||
|
||||
const appliedConfiguration = (
|
||||
client: AgentConfigurationClientId,
|
||||
selectedModel: string,
|
||||
appliedModel = 'model-a',
|
||||
) => resolveAgentConfigurationAction({
|
||||
client,
|
||||
modificationState: 'applied',
|
||||
selectedModel,
|
||||
appliedModel,
|
||||
oauthConfiguration: false,
|
||||
appliedOauthConfiguration: false,
|
||||
modelMappings: {
|
||||
opus: selectedModel,
|
||||
sonnet: selectedModel,
|
||||
haiku: selectedModel,
|
||||
},
|
||||
appliedModelMappings: {
|
||||
opus: appliedModel,
|
||||
sonnet: appliedModel,
|
||||
haiku: appliedModel,
|
||||
},
|
||||
});
|
||||
|
||||
describe('agent configuration update action', () => {
|
||||
test.each<AgentConfigurationClientId>([
|
||||
'claude-code',
|
||||
'claude-desktop',
|
||||
'codex',
|
||||
'opencode',
|
||||
'openclaw',
|
||||
'hermes',
|
||||
])('%s updates only while its model draft differs', (client) => {
|
||||
expect(appliedConfiguration(client, 'model-b')).toBe('update');
|
||||
expect(appliedConfiguration(client, ' MODEL-A ')).toBe('close');
|
||||
});
|
||||
|
||||
test('Codex also updates when only OAuth configuration changes', () => {
|
||||
expect(resolveAgentConfigurationAction({
|
||||
client: 'codex',
|
||||
modificationState: 'applied',
|
||||
selectedModel: 'model-a',
|
||||
appliedModel: 'model-a',
|
||||
oauthConfiguration: true,
|
||||
appliedOauthConfiguration: false,
|
||||
modelMappings: { opus: '', sonnet: '', haiku: '' },
|
||||
appliedModelMappings: { opus: '', sonnet: '', haiku: '' },
|
||||
})).toBe('update');
|
||||
});
|
||||
|
||||
test('Pi never exposes the model update action', () => {
|
||||
expect(appliedConfiguration('pi', 'model-b')).toBe('close');
|
||||
});
|
||||
});
|
||||
@@ -7,21 +7,29 @@ import {
|
||||
} from '../src/services/providerHealthCheck';
|
||||
|
||||
describe('API 接入健康检测', () => {
|
||||
it('合并发现模型、已配置模型和 test-model,并按名称去重', () => {
|
||||
it('健康检测只保留已勾选模型,并使用发现结果补充模型信息', () => {
|
||||
const models = mergeProviderHealthModels(
|
||||
[{ name: 'model-b' }, { name: 'model-a' }],
|
||||
[
|
||||
{ name: 'model-b' },
|
||||
{ name: 'model-a', contextWindow: 200_000 },
|
||||
{ name: 'model-c' },
|
||||
],
|
||||
[{ name: 'MODEL-A', alias: 'model-a-alias' }, { name: 'model-c' }],
|
||||
'health-model',
|
||||
);
|
||||
|
||||
expect(models).toEqual([
|
||||
{ name: 'health-model' },
|
||||
{ name: 'MODEL-A', alias: 'model-a-alias' },
|
||||
{ name: 'model-b' },
|
||||
{ name: 'MODEL-A', alias: 'model-a-alias', contextWindow: 200_000 },
|
||||
{ name: 'model-c' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('没有勾选模型时不允许发现列表自动加入健康检测', () => {
|
||||
expect(mergeProviderHealthModels(
|
||||
[{ name: 'model-a' }, { name: 'model-b' }],
|
||||
[],
|
||||
)).toEqual([]);
|
||||
});
|
||||
|
||||
it('逐模型检测只使用当前接入的首个有效密钥', () => {
|
||||
expect(primaryProviderHealthCredential(['', ' first-key ', 'second-key'])).toBe('first-key');
|
||||
expect(primaryProviderHealthCredential([])).toBe('');
|
||||
|
||||
Reference in new issue
Block a user