mirror of
https://github.com/tiennm99/ccs.git
synced 2026-07-16 10:16:49 +00:00
fix(cliproxy): preserve saved codex model selections
- stop the Codex free-plan compatibility guard from rewriting codex.settings.json - keep saved dashboard selections intact and rely on runtime fallback when needed - update reconcile coverage to lock the non-mutating behavior in place
This commit is contained in:
@@ -3,7 +3,6 @@ import { getProviderCatalog } from './model-catalog';
|
||||
import { fetchCodexQuota } from './quota-fetcher-codex';
|
||||
import { getCachedQuota, setCachedQuota } from './quota-response-cache';
|
||||
import type { CodexQuotaResult } from './quota-types';
|
||||
import { updateSettingsModel } from './services/variant-settings';
|
||||
import { info, warn } from '../utils/ui';
|
||||
|
||||
export type CodexPlanType = CodexQuotaResult['planType'];
|
||||
@@ -146,7 +145,7 @@ export async function reconcileCodexModelForActivePlan(
|
||||
},
|
||||
deps: CodexPlanCompatibilityDeps = {}
|
||||
): Promise<void> {
|
||||
const { settingsPath, currentModel, verbose } = options;
|
||||
const { currentModel, verbose } = options;
|
||||
if (!currentModel) return;
|
||||
|
||||
const fallbackModel = getFreePlanFallbackCodexModel(currentModel);
|
||||
@@ -175,13 +174,10 @@ export async function reconcileCodexModelForActivePlan(
|
||||
}
|
||||
|
||||
if (quota.planType === 'free') {
|
||||
updateSettingsModel(settingsPath, fallbackModel, 'codex', {
|
||||
rewriteHaikuModel: (haikuModel) => getFreePlanFallbackCodexModel(haikuModel) ?? haikuModel,
|
||||
});
|
||||
console.error(
|
||||
formatInfo(
|
||||
`Codex free plan detected. Switched unsupported model "${normalizeCodexModelId(currentModel)}" ` +
|
||||
`to "${fallbackModel}".`
|
||||
`Codex free plan detected. Keeping saved model "${normalizeCodexModelId(currentModel)}" in settings; ` +
|
||||
`runtime requests will fall back to "${fallbackModel}" when needed.`
|
||||
)
|
||||
);
|
||||
return;
|
||||
|
||||
@@ -45,7 +45,7 @@ async function importCompatibilityModule(cacheTag: string) {
|
||||
const identity = (message: string) => message;
|
||||
|
||||
describe('codex plan compatibility reconcile', () => {
|
||||
it('repairs stale paid-only Codex settings for free-plan accounts before launch', async () => {
|
||||
it('keeps saved Codex settings intact and warns about runtime fallback for free-plan accounts', async () => {
|
||||
const { tmpDir, settingsPath } = createCodexSettingsFixture('gpt-5.3-codex-spark');
|
||||
const errorSpy = spyOn(console, 'error').mockImplementation(() => {});
|
||||
|
||||
@@ -76,12 +76,12 @@ describe('codex plan compatibility reconcile', () => {
|
||||
const repaired = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as {
|
||||
env: Record<string, string>;
|
||||
};
|
||||
expect(repaired.env.ANTHROPIC_MODEL).toBe('gpt-5-codex');
|
||||
expect(repaired.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5-codex');
|
||||
expect(repaired.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5-codex');
|
||||
expect(repaired.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-codex-mini');
|
||||
expect(repaired.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(repaired.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(repaired.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(repaired.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5.3-codex-spark');
|
||||
expect(errorSpy).toHaveBeenCalledWith(
|
||||
'Codex free plan detected. Switched unsupported model "gpt-5.3-codex" to "gpt-5-codex".'
|
||||
'Codex free plan detected. Keeping saved model "gpt-5.3-codex" in settings; runtime requests will fall back to "gpt-5-codex" when needed.'
|
||||
);
|
||||
} finally {
|
||||
fs.rmSync(tmpDir, { recursive: true, force: true });
|
||||
|
||||
Reference in New Issue
Block a user