diff --git a/src/app/api/providers/[id]/models/route.js b/src/app/api/providers/[id]/models/route.js index 7418d826..106130f2 100644 --- a/src/app/api/providers/[id]/models/route.js +++ b/src/app/api/providers/[id]/models/route.js @@ -2,7 +2,7 @@ import { NextResponse } from "next/server"; import { getProviderConnectionById } from "@/models"; import { isOpenAICompatibleProvider, isAnthropicCompatibleProvider } from "@/shared/constants/providers"; import { GEMINI_CONFIG } from "@/lib/oauth/constants/oauth"; -import { refreshGoogleToken, updateProviderCredentials } from "@/sse/services/tokenRefresh"; +import { refreshGoogleToken, refreshCodexToken, updateProviderCredentials } from "@/sse/services/tokenRefresh"; import { resolveOllamaLocalHost } from "open-sse/config/providers.js"; import { getModelsByProviderId } from "open-sse/config/providerModels.js"; import { resolveKiroModels } from "open-sse/services/kiroModels.js"; @@ -13,6 +13,13 @@ import { resolveConnectionProxyConfig } from "@/lib/network/connectionProxy"; const GEMINI_CLI_MODELS_URL = "https://cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels"; +// The /codex/models endpoint gates each entry by minimal_client_version against this +// value, and codex CLI's own manifest (openai/codex codex-rs/models-manager/models.json) +// already requires 0.144.0 for its newest models, so a stale client_version here comes +// back 200 with those entries quietly missing instead of erroring. +const CODEX_CLIENT_VERSION = "0.144.6"; +const CODEX_MODELS_URL = `https://chatgpt.com/backend-api/codex/models?client_version=${CODEX_CLIENT_VERSION}`; + const parseOpenAIStyleModels = (data) => { if (Array.isArray(data)) return data; return data?.data || data?.models || data?.results || []; @@ -157,12 +164,20 @@ const PROVIDER_MODELS_CONFIG = { parseResponse: (data) => data.data || [] }, codex: { - url: "https://chatgpt.com/backend-api/codex/models?client_version=1.0.0", - method: "GET", - headers: { "Content-Type": "application/json", "Accept": "application/json" }, - authHeader: "Authorization", - authPrefix: "Bearer ", - parseResponse: parseCodexModels + customResolver: buildOAuthResolver({ + refreshFn: (conn) => refreshCodexToken(conn.refreshToken), + fetchFn: (token) => fetch(CODEX_MODELS_URL, { + method: "GET", + headers: { + "Content-Type": "application/json", + "Accept": "application/json", + "Authorization": `Bearer ${token}`, + "originator": "codex_cli_rs" + } + }), + parseFn: parseCodexModels, + errorLabel: "Failed to fetch Codex models" + }) }, antigravity: { url: "https://daily-cloudcode-pa.sandbox.googleapis.com/v1internal:models",