mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-13 20:14:34 +00:00
fix(profile): handle km compatibility for legacy kimi api users
This commit is contained in:
1 parent
7efbac6c1a
commit
cf8070b5f0
17 files changed
+266
-54
No files matched your search
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user