Merge pull request #557 from kaitranntt/feat/556-codex-53-preset-default

feat: add Codex 5.3 preset and default base-codex model
This commit is contained in:
Kai (Tam Nhu) Tran
2026-02-14 06:51:43 +07:00
committed by GitHub
7 changed files with 101 additions and 15 deletions
+4 -4
View File
@@ -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.1-codex-max",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.1-codex-max-high",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.1-codex-max",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.1-codex-mini-high"
"ANTHROPIC_MODEL": "gpt-5.3-codex",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex-high",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.3-codex-spark"
}
}
+24 -2
View File
@@ -160,12 +160,34 @@ export const MODEL_CATALOG: Partial<Record<CLIProxyProvider, ProviderCatalog>> =
codex: {
provider: 'codex',
displayName: 'Copilot Codex',
defaultModel: 'gpt-5.2-codex',
defaultModel: 'gpt-5.3-codex',
models: [
{
id: 'gpt-5.3-codex',
name: 'GPT-5.3 Codex',
description: 'Full reasoning support (xhigh)',
thinking: {
type: 'levels',
levels: ['medium', 'high', 'xhigh'],
maxLevel: 'xhigh',
dynamicAllowed: false,
},
},
{
id: 'gpt-5.3-codex-spark',
name: 'GPT-5.3 Codex Spark',
description: 'Ultra-fast coding model',
thinking: {
type: 'levels',
levels: ['medium', 'high', 'xhigh'],
maxLevel: 'xhigh',
dynamicAllowed: false,
},
},
{
id: 'gpt-5.2-codex',
name: 'GPT-5.2 Codex',
description: 'Full reasoning support (xhigh)',
description: 'Previous stable Codex model',
thinking: {
type: 'levels',
levels: ['medium', 'high', 'xhigh'],
+5 -1
View File
@@ -142,6 +142,10 @@ export async function configureProviderModel(
// Get base env vars for defaults
const baseEnv = getClaudeEnvVars(provider);
const codexSonnetModel =
provider === 'codex' && !selectedModel.match(/-(xhigh|high|medium)$/)
? `${selectedModel}-high`
: selectedModel;
// Read existing settings to preserve user customizations
let existingSettings: Record<string, unknown> = {};
@@ -165,7 +169,7 @@ export async function configureProviderModel(
ANTHROPIC_AUTH_TOKEN: baseEnv.ANTHROPIC_AUTH_TOKEN || '',
ANTHROPIC_MODEL: selectedModel,
ANTHROPIC_DEFAULT_OPUS_MODEL: selectedModel,
ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,
ANTHROPIC_DEFAULT_SONNET_MODEL: codexSonnetModel,
ANTHROPIC_DEFAULT_HAIKU_MODEL: baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || '',
};
+1 -1
View File
@@ -253,7 +253,7 @@ export function updateVariant(name: string, updates: UpdateVariantOptions): Vari
existing.port
);
} else if (updates.model !== undefined) {
updateSettingsModel(settingsPath, updates.model);
updateSettingsModel(settingsPath, updates.model, existing.provider as CLIProxyProfileName);
}
}
+17 -3
View File
@@ -44,17 +44,26 @@ function buildSettingsEnv(
port: number = CLIPROXY_DEFAULT_PORT
): SettingsEnv {
const baseEnv = getClaudeEnvVars(provider as CLIProxyProvider, port);
const codexSonnetModel = normalizeCodexSonnetModel(provider, model);
return {
ANTHROPIC_BASE_URL: baseEnv.ANTHROPIC_BASE_URL || '',
ANTHROPIC_AUTH_TOKEN: baseEnv.ANTHROPIC_AUTH_TOKEN || '',
ANTHROPIC_MODEL: model,
ANTHROPIC_DEFAULT_OPUS_MODEL: model,
ANTHROPIC_DEFAULT_SONNET_MODEL: model,
ANTHROPIC_DEFAULT_SONNET_MODEL: codexSonnetModel,
ANTHROPIC_DEFAULT_HAIKU_MODEL: baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || model,
};
}
function normalizeCodexSonnetModel(
provider: CLIProxyProfileName | undefined,
model: string
): string {
if (provider !== 'codex') return model;
return /-(xhigh|high|medium)$/.test(model) ? model : `${model}-high`;
}
/**
* Ensure directory exists
*/
@@ -266,7 +275,11 @@ export function deleteSettingsFile(settingsPath: string): boolean {
/**
* Update model in an existing settings file
*/
export function updateSettingsModel(settingsPath: string, model: string): void {
export function updateSettingsModel(
settingsPath: string,
model: string,
provider?: CLIProxyProfileName
): void {
const fileName = path.basename(settingsPath);
if (fileName.startsWith('composite-')) {
console.log(
@@ -286,9 +299,10 @@ export function updateSettingsModel(settingsPath: string, model: string): void {
if (model) {
settings.env = settings.env || ({} as SettingsEnv);
const codexSonnetModel = normalizeCodexSonnetModel(provider, model);
settings.env.ANTHROPIC_MODEL = model;
settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;
settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;
settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = codexSonnetModel;
} else {
// Clear model settings to use defaults
delete (settings.env as unknown as Record<string, string>).ANTHROPIC_MODEL;
@@ -107,4 +107,28 @@ cliproxy:
const config = loadOrCreateUnifiedConfig();
expect(config.cliproxy?.variants?.demo?.provider).toBe('codex');
});
it('preserves codex sonnet alias on model-only updates', () => {
const toCodex = updateVariant('demo', {
provider: 'codex',
model: 'gpt-5.3-codex',
});
expect(toCodex.success).toBe(true);
const settingsPath = path.join(tmpDir, 'gemini-demo.settings.json');
let settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as {
env: Record<string, string>;
};
expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high');
const modelOnly = updateVariant('demo', { model: 'gpt-5.3-codex' });
expect(modelOnly.success).toBe(true);
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as {
env: Record<string, string>;
};
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-high');
});
});
+26 -4
View File
@@ -133,16 +133,38 @@ export const MODEL_CATALOGS: Record<string, ProviderCatalog> = {
codex: {
provider: 'codex',
displayName: 'Codex',
defaultModel: 'gpt-5.2-codex',
defaultModel: 'gpt-5.3-codex',
models: [
{
id: 'gpt-5.3-codex',
name: 'GPT-5.3 Codex',
description: 'Full reasoning support (xhigh)',
presetMapping: {
default: 'gpt-5.3-codex',
opus: 'gpt-5.3-codex',
sonnet: 'gpt-5.3-codex-high',
haiku: 'gpt-5.3-codex-spark',
},
},
{
id: 'gpt-5.3-codex-spark',
name: 'GPT-5.3 Codex Spark',
description: 'Ultra-fast coding model',
presetMapping: {
default: 'gpt-5.3-codex-spark',
opus: 'gpt-5.3-codex',
sonnet: 'gpt-5.3-codex-high',
haiku: 'gpt-5.3-codex-spark',
},
},
{
id: 'gpt-5.2-codex',
name: 'GPT-5.2 Codex',
description: 'Full reasoning support (xhigh)',
description: 'Previous stable Codex model',
presetMapping: {
default: 'gpt-5.2-codex',
opus: 'gpt-5.2-codex',
sonnet: 'gpt-5.2-codex',
sonnet: 'gpt-5.2-codex-high',
haiku: 'gpt-5-mini',
},
},
@@ -152,7 +174,7 @@ export const MODEL_CATALOGS: Record<string, ProviderCatalog> = {
description: 'Fast, capped at high reasoning (no xhigh)',
presetMapping: {
default: 'gpt-5-mini',
opus: 'gpt-5.2-codex',
opus: 'gpt-5.3-codex',
sonnet: 'gpt-5-mini',
haiku: 'gpt-5-mini',
},