fix(profile): handle km compatibility for legacy kimi api users

This commit is contained in:
Tam Nhu Tran committed 2026-02-19 12:43:41 +07:00
1 parent 7efbac6c1a
commit cf8070b5f0
17 files changed
+266 -54

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
import { describe, expect, it } from 'bun:test';
import { getPresetById, isValidPresetId } from '../../../src/api/services/provider-presets';
describe('provider-presets', () => {
it('resolves canonical km preset id', () => {
const preset = getPresetById('km');
expect(preset?.id).toBe('km');
});
it('resolves legacy kimi preset alias to km', () => {
const preset = getPresetById('kimi');
expect(preset?.id).toBe('km');
});
it('treats legacy kimi alias as a valid preset id', () => {
expect(isValidPresetId('kimi')).toBe(true);
});
});
+37
View File
@@ -120,6 +120,43 @@ describe('ProfileDetector', () => {
}
});
it('should resolve km to legacy kimi API profile from unified config', () => {
const settingsPath = path.join(tempDir, 'kimi.settings.json');
fs.writeFileSync(
settingsPath,
JSON.stringify({ env: { ANTHROPIC_MODEL: 'kimi-k2-thinking-turbo' } })
);
const mockUnifiedConfig = {
version: 2,
profiles: {
kimi: { settings: settingsPath, type: 'api' },
},
};
const isUnifiedModeSpy = spyOn(unifiedConfigLoader, 'isUnifiedMode').mockReturnValue(true);
const loadUnifiedConfigSpy = spyOn(unifiedConfigLoader, 'loadUnifiedConfig').mockReturnValue(
mockUnifiedConfig as any
);
try {
const result = detector.detectProfileType('km');
expect(result.type).toBe('settings');
expect(result.name).toBe('km');
expect(result.settingsPath).toBe(settingsPath);
expect(result.env).toEqual({ ANTHROPIC_MODEL: 'kimi-k2-thinking-turbo' });
} finally {
isUnifiedModeSpy.mockRestore();
loadUnifiedConfigSpy.mockRestore();
}
});
it('should keep ccs kimi mapped to CLIProxy provider', () => {
const result = detector.detectProfileType('kimi');
expect(result.type).toBe('cliproxy');
expect(result.provider).toBe('kimi');
});
it('should detect account-based profile from unified config', () => {
const mockUnifiedConfig = {
version: 2,
+33
View File
@@ -0,0 +1,33 @@
import { describe, expect, it } from 'bun:test';
import { getProfileLookupCandidates, isLegacyProfileAlias } from '../../../src/utils/profile-compat';
describe('profile-compat', () => {
describe('getProfileLookupCandidates', () => {
it('returns km candidates with legacy kimi fallback', () => {
expect(getProfileLookupCandidates('km')).toEqual(['km', 'kimi']);
});
it('keeps non-aliased profiles unchanged', () => {
expect(getProfileLookupCandidates('glm')).toEqual(['glm']);
});
it('normalizes uppercase input and still resolves aliases', () => {
expect(getProfileLookupCandidates('KM')).toEqual(['KM', 'km', 'kimi']);
});
});
describe('isLegacyProfileAlias', () => {
it('returns true for km -> kimi', () => {
expect(isLegacyProfileAlias('km', 'kimi')).toBe(true);
});
it('returns false for canonical names', () => {
expect(isLegacyProfileAlias('km', 'km')).toBe(false);
expect(isLegacyProfileAlias('glm', 'glm')).toBe(false);
});
it('returns false for unrelated names', () => {
expect(isLegacyProfileAlias('glm', 'kimi')).toBe(false);
});
});
});