mirror of
https://github.com/tiennm99/ccs.git
synced 2026-07-16 04:18:05 +00:00
Merge pull request #609 from kaitranntt/kai/fix/602-codex-model-suffix
fix(cliproxy): keep canonical codex model ids in settings
This commit is contained in:
@@ -2,9 +2,9 @@
|
||||
"env": {
|
||||
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/codex",
|
||||
"ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed",
|
||||
"ANTHROPIC_MODEL": "gpt-5.3-codex-xhigh",
|
||||
"ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex-xhigh",
|
||||
"ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex-high",
|
||||
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-mini-medium"
|
||||
"ANTHROPIC_MODEL": "gpt-5.3-codex",
|
||||
"ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex",
|
||||
"ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex",
|
||||
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-mini"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,13 +21,9 @@ function stripCodexEffortSuffix(model: string, provider: CLIProxyProvider): stri
|
||||
return model.replace(CODEX_EFFORT_SUFFIX_REGEX, '');
|
||||
}
|
||||
|
||||
function normalizeCodexTierModel(
|
||||
provider: CLIProxyProvider,
|
||||
model: string,
|
||||
fallbackEffort: 'medium' | 'high' | 'xhigh'
|
||||
): string {
|
||||
function normalizeCodexTierModel(provider: CLIProxyProvider, model: string): string {
|
||||
if (provider !== 'codex') return model;
|
||||
return CODEX_EFFORT_SUFFIX_REGEX.test(model) ? model : `${model}-${fallbackEffort}`;
|
||||
return stripCodexEffortSuffix(model, provider);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -160,13 +156,12 @@ export async function configureProviderModel(
|
||||
|
||||
// Get base env vars for defaults
|
||||
const baseEnv = getClaudeEnvVars(provider);
|
||||
const selectedDefaultModel = normalizeCodexTierModel(provider, selectedModel, 'xhigh');
|
||||
const selectedOpusModel = normalizeCodexTierModel(provider, selectedModel, 'xhigh');
|
||||
const selectedSonnetModel = normalizeCodexTierModel(provider, selectedModel, 'high');
|
||||
const selectedDefaultModel = normalizeCodexTierModel(provider, selectedModel);
|
||||
const selectedOpusModel = normalizeCodexTierModel(provider, selectedModel);
|
||||
const selectedSonnetModel = normalizeCodexTierModel(provider, selectedModel);
|
||||
const selectedHaikuModel = normalizeCodexTierModel(
|
||||
provider,
|
||||
baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || selectedModel,
|
||||
'medium'
|
||||
baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || selectedModel
|
||||
);
|
||||
|
||||
// Read existing settings to preserve user customizations
|
||||
|
||||
@@ -37,17 +37,12 @@ interface SettingsFile {
|
||||
|
||||
const CODEX_EFFORT_SUFFIX_REGEX = /-(xhigh|high|medium)$/i;
|
||||
|
||||
function hasCodexEffortSuffix(model: string): boolean {
|
||||
return CODEX_EFFORT_SUFFIX_REGEX.test(model);
|
||||
}
|
||||
|
||||
function normalizeCodexTierModel(
|
||||
function canonicalizeModelForProvider(
|
||||
provider: CLIProxyProfileName | undefined,
|
||||
model: string,
|
||||
fallbackEffort: 'medium' | 'high' | 'xhigh'
|
||||
model: string
|
||||
): string {
|
||||
if (provider !== 'codex') return model;
|
||||
return hasCodexEffortSuffix(model) ? model : `${model}-${fallbackEffort}`;
|
||||
return model.replace(CODEX_EFFORT_SUFFIX_REGEX, '');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,13 +54,13 @@ function buildSettingsEnv(
|
||||
port: number = CLIPROXY_DEFAULT_PORT
|
||||
): SettingsEnv {
|
||||
const baseEnv = getClaudeEnvVars(provider as CLIProxyProvider, port);
|
||||
const defaultModel = normalizeCodexTierModel(provider, model, 'xhigh');
|
||||
const opusModel = normalizeCodexTierModel(provider, model, 'xhigh');
|
||||
const sonnetModel = normalizeCodexTierModel(provider, model, 'high');
|
||||
const haikuModel = normalizeCodexTierModel(
|
||||
const normalizedModel = canonicalizeModelForProvider(provider, model);
|
||||
const defaultModel = normalizedModel;
|
||||
const opusModel = normalizedModel;
|
||||
const sonnetModel = normalizedModel;
|
||||
const haikuModel = canonicalizeModelForProvider(
|
||||
provider,
|
||||
baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || model,
|
||||
'medium'
|
||||
baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || model
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -313,18 +308,14 @@ export function updateSettingsModel(
|
||||
|
||||
if (model) {
|
||||
settings.env = settings.env || ({} as SettingsEnv);
|
||||
settings.env.ANTHROPIC_MODEL = normalizeCodexTierModel(provider, model, 'xhigh');
|
||||
settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = normalizeCodexTierModel(provider, model, 'xhigh');
|
||||
settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = normalizeCodexTierModel(
|
||||
provider,
|
||||
model,
|
||||
'high'
|
||||
);
|
||||
const normalizedModel = canonicalizeModelForProvider(provider, model);
|
||||
settings.env.ANTHROPIC_MODEL = normalizedModel;
|
||||
settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = normalizedModel;
|
||||
settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = normalizedModel;
|
||||
if (provider === 'codex' && settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL) {
|
||||
settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = normalizeCodexTierModel(
|
||||
settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = canonicalizeModelForProvider(
|
||||
provider,
|
||||
settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL,
|
||||
'medium'
|
||||
settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -100,10 +100,10 @@ cliproxy:
|
||||
};
|
||||
|
||||
expect(settings.env.ANTHROPIC_BASE_URL).toContain('/api/provider/codex');
|
||||
expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.1-codex-mini-xhigh');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.1-codex-mini-xhigh');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.1-codex-mini-high');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini-medium');
|
||||
expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.1-codex-mini');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.1-codex-mini');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.1-codex-mini');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini');
|
||||
expect(settings.env.CUSTOM_FLAG).toBe('keep-me');
|
||||
expect(settings.hooks.PreToolUse.length).toBe(1);
|
||||
|
||||
@@ -122,10 +122,10 @@ cliproxy:
|
||||
let settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as {
|
||||
env: Record<string, string>;
|
||||
};
|
||||
expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex-xhigh');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex-xhigh');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini-medium');
|
||||
expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini');
|
||||
|
||||
const modelOnly = updateVariant('demo', { model: 'gpt-5.3-codex' });
|
||||
expect(modelOnly.success).toBe(true);
|
||||
@@ -133,9 +133,9 @@ cliproxy:
|
||||
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as {
|
||||
env: Record<string, string>;
|
||||
};
|
||||
expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex-xhigh');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex-xhigh');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini-medium');
|
||||
expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex');
|
||||
expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user