diff --git a/codex-cli/src/cli.tsx b/codex-cli/src/cli.tsx index c7e5d9ff..0442a6c3 100644 --- a/codex-cli/src/cli.tsx +++ b/codex-cli/src/cli.tsx @@ -45,6 +45,7 @@ import { createInputItem } from "./utils/input-utils"; import { initLogger } from "./utils/logger/log"; import { isModelSupportedForResponses } from "./utils/model-utils.js"; import { parseToolCall } from "./utils/parsers"; +import { providers } from "./utils/providers"; import { onExit, setInkRenderer } from "./utils/terminal"; import chalk from "chalk"; import { spawnSync } from "child_process"; @@ -327,26 +328,44 @@ try { // ignore errors } -if (cli.flags.login) { - apiKey = await fetchApiKey(client.issuer, client.client_id); - try { - const home = os.homedir(); - const authDir = path.join(home, ".codex"); - const authFile = path.join(authDir, "auth.json"); - if (fs.existsSync(authFile)) { - const data = JSON.parse(fs.readFileSync(authFile, "utf-8")); - savedTokens = data.tokens; +// Get provider-specific API key if not OpenAI +if (provider.toLowerCase() !== "openai") { + const providerInfo = providers[provider.toLowerCase()]; + if (providerInfo) { + const providerApiKey = process.env[providerInfo.envKey]; + if (providerApiKey) { + apiKey = providerApiKey; } - } catch { - /* ignore */ } -} else if (!apiKey) { - apiKey = await fetchApiKey(client.issuer, client.client_id); } + +// Only proceed with OpenAI auth flow if: +// 1. Provider is OpenAI and no API key is set, or +// 2. Login flag is explicitly set +if (provider.toLowerCase() === "openai" && !apiKey) { + if (cli.flags.login) { + apiKey = await fetchApiKey(client.issuer, client.client_id); + try { + const home = os.homedir(); + const authDir = path.join(home, ".codex"); + const authFile = path.join(authDir, "auth.json"); + if (fs.existsSync(authFile)) { + const data = JSON.parse(fs.readFileSync(authFile, "utf-8")); + savedTokens = data.tokens; + } + } catch { + /* ignore */ + } + } else { + apiKey = await fetchApiKey(client.issuer, client.client_id); + } +} + // Ensure the API key is available as an environment variable for legacy code process.env["OPENAI_API_KEY"] = apiKey; -if (cli.flags.free) { +// Only attempt credit redemption for OpenAI provider +if (cli.flags.free && provider.toLowerCase() === "openai") { // eslint-disable-next-line no-console console.log(`${chalk.bold("codex --free")} attempting to redeem credits...`); if (!savedTokens?.refresh_token) { @@ -379,13 +398,18 @@ if (!apiKey && !NO_API_KEY_REQUIRED.has(provider.toLowerCase())) { ? `You can create a key here: ${chalk.bold( chalk.underline("https://platform.openai.com/account/api-keys"), )}\n` - : provider.toLowerCase() === "gemini" + : provider.toLowerCase() === "azure" ? `You can create a ${chalk.bold( - `${provider.toUpperCase()}_API_KEY`, - )} ` + `in the ${chalk.bold(`Google AI Studio`)}.\n` - : `You can create a ${chalk.bold( - `${provider.toUpperCase()}_API_KEY`, - )} ` + `in the ${chalk.bold(`${provider}`)} dashboard.\n` + `${provider.toUpperCase()}_OPENAI_API_KEY`, + )} ` + + `in Azure AI Foundry portal at ${chalk.bold(chalk.underline("https://ai.azure.com"))}.\n` + : provider.toLowerCase() === "gemini" + ? `You can create a ${chalk.bold( + `${provider.toUpperCase()}_API_KEY`, + )} ` + `in the ${chalk.bold(`Google AI Studio`)}.\n` + : `You can create a ${chalk.bold( + `${provider.toUpperCase()}_API_KEY`, + )} ` + `in the ${chalk.bold(`${provider}`)} dashboard.\n` }`, ); process.exit(1);