feat: Refactor model handling & reasoning effort across navigation, typeahead, OpenAI/Codex providers, API shim, configs, and UI (adds EffortPicker, new mappings/options, unique suggestion IDs, effort utilities; removes deprecated aliases; defaults Codex to gpt-5.4; improves selection logic and status display)

This commit is contained in:
Meet Patel
2026-04-02 17:17:14 +05:30
parent 9f48bb4431
commit 8f50f17674
15 changed files with 612 additions and 139 deletions

View File

@@ -12,6 +12,7 @@ import { formatNumber } from './format.js';
import { getIdeClientName, type IDEExtensionInstallationStatus, isJetBrainsIde, toIDEDisplayName } from './ide.js';
import { getClaudeAiUserDefaultModelDescription, modelDisplayString } from './model/model.js';
import { getAPIProvider } from './model/providers.js';
import { resolveProviderRequest } from '../services/api/providerConfig.js';
import { getMTLSConfig } from './mtls.js';
import { checkInstall } from './nativeInstaller/index.js';
import { getProxyUrl } from './proxy.js';
@@ -247,6 +248,7 @@ export function buildAPIProviderProperties(): Property[] {
vertex: 'Google Vertex AI',
foundry: 'Microsoft Foundry',
openai: 'OpenAI-compatible',
codex: 'Codex',
gemini: 'Google Gemini',
}[apiProvider];
properties.push({
@@ -325,34 +327,73 @@ export function buildAPIProviderProperties(): Property[] {
}
} else if (apiProvider === 'openai') {
const openaiBaseUrl = process.env.OPENAI_BASE_URL;
if (openaiBaseUrl) {
properties.push({
label: 'OpenAI base URL',
value: redactSecretValueForDisplay(openaiBaseUrl, process.env) ?? openaiBaseUrl
});
if (openaiBaseUrl) {
properties.push({
label: 'OpenAI base URL',
value: redactSecretValueForDisplay(openaiBaseUrl, process.env) ?? openaiBaseUrl
});
}
const openaiModel = process.env.OPENAI_MODEL;
if (openaiModel) {
// Build display model string with resolved model + reasoning effort
let modelDisplay = openaiModel;
const resolved = resolveProviderRequest({ model: openaiModel });
const resolvedModel = resolved.resolvedModel;
const reasoningEffort = resolved.reasoning?.effort;
if (resolvedModel && resolvedModel !== openaiModel.toLowerCase()) {
// Show resolved model name
modelDisplay = resolvedModel;
}
const openaiModel = process.env.OPENAI_MODEL;
if (openaiModel) {
properties.push({
label: 'Model',
value: redactSecretValueForDisplay(openaiModel, process.env) ?? openaiModel
});
if (reasoningEffort) {
modelDisplay = `${modelDisplay} (${reasoningEffort})`;
}
} else if (apiProvider === 'gemini') {
const geminiBaseUrl = process.env.GEMINI_BASE_URL;
if (geminiBaseUrl) {
properties.push({
label: 'Gemini base URL',
value: redactSecretValueForDisplay(geminiBaseUrl, process.env) ?? geminiBaseUrl
});
properties.push({
label: 'Model',
value: redactSecretValueForDisplay(modelDisplay, process.env) ?? modelDisplay
});
}
} else if (apiProvider === 'codex') {
const codexBaseUrl = process.env.OPENAI_BASE_URL;
if (codexBaseUrl) {
properties.push({
label: 'Codex base URL',
value: redactSecretValueForDisplay(codexBaseUrl, process.env) ?? codexBaseUrl
});
}
const openaiModel = process.env.OPENAI_MODEL;
if (openaiModel) {
// Build display model string with resolved model + reasoning effort
let modelDisplay = openaiModel;
const resolved = resolveProviderRequest({ model: openaiModel });
const resolvedModel = resolved.resolvedModel;
const reasoningEffort = resolved.reasoning?.effort;
if (resolvedModel && resolvedModel !== openaiModel.toLowerCase()) {
// Show resolved model name
modelDisplay = resolvedModel;
}
const geminiModel = process.env.GEMINI_MODEL;
if (geminiModel) {
properties.push({
label: 'Model',
value: redactSecretValueForDisplay(geminiModel, process.env) ?? geminiModel
});
if (reasoningEffort) {
modelDisplay = `${modelDisplay} (${reasoningEffort})`;
}
properties.push({
label: 'Model',
value: redactSecretValueForDisplay(modelDisplay, process.env) ?? modelDisplay
});
}
} else if (apiProvider === 'gemini') {
const geminiBaseUrl = process.env.GEMINI_BASE_URL;
if (geminiBaseUrl) {
properties.push({
label: 'Gemini base URL',
value: redactSecretValueForDisplay(geminiBaseUrl, process.env) ?? geminiBaseUrl
});
}
const geminiModel = process.env.GEMINI_MODEL;
if (geminiModel) {
properties.push({
label: 'Model',
value: redactSecretValueForDisplay(geminiModel, process.env) ?? geminiModel
});
}
}
const proxyUrl = getProxyUrl();
if (proxyUrl) {