fix(openai): align Codex fallback with GPT-5.5

This commit is contained in:
Peter Steinberger
2026-04-23 21:02:21 +01:00
parent 956350bb9c
commit 058e6f588a
8 changed files with 24 additions and 19 deletions

View File

@@ -13,9 +13,9 @@ const DEFAULT_MAX_TOKENS = 128_000;
export const FALLBACK_CODEX_MODELS = [
{
id: "gpt-5.4",
model: "gpt-5.4",
displayName: "gpt-5.4",
id: "gpt-5.5",
model: "gpt-5.5",
displayName: "gpt-5.5",
description: "Latest frontier agentic coding model.",
isDefault: true,
inputModalities: ["text", "image"],

View File

@@ -17,7 +17,7 @@ function expectStaticFallbackCatalog(
result: Awaited<ReturnType<typeof buildCodexProviderCatalog>>,
) {
expect(result.provider.models.map((model) => model.id)).toEqual([
"gpt-5.4",
"gpt-5.5",
"gpt-5.4-mini",
"gpt-5.2",
]);
@@ -241,7 +241,7 @@ describe("codex provider", () => {
expect(
result && "provider" in result ? result.provider.models.map((model) => model.id) : [],
).toEqual(["gpt-5.4", "gpt-5.4-mini", "gpt-5.2"]);
).toEqual(["gpt-5.5", "gpt-5.4-mini", "gpt-5.2"]);
});
it("adds the GPT-5 prompt overlay to Codex provider runs", () => {

View File

@@ -110,7 +110,7 @@ export async function buildCodexProviderCatalog(
};
}
function resolveCodexDynamicModel(modelId: string): ProviderRuntimeModel | undefined {
function resolveCodexDynamicModel(modelId: string) {
const id = modelId.trim();
if (!id) {
return undefined;
@@ -191,5 +191,7 @@ function isKnownXHighCodexModel(modelId: string): boolean {
function isModernCodexModel(modelId: string): boolean {
const lower = modelId.trim().toLowerCase();
return lower === "gpt-5.4" || lower === "gpt-5.4-mini" || lower === "gpt-5.2";
return (
lower === "gpt-5.5" || lower === "gpt-5.4" || lower === "gpt-5.4-mini" || lower === "gpt-5.2"
);
}

View File

@@ -114,9 +114,7 @@ function normalizeOpenAITransport(model: ProviderRuntimeModel): ProviderRuntimeM
};
}
function resolveOpenAIGptForwardCompatModel(
ctx: ProviderResolveDynamicModelContext,
): ProviderRuntimeModel | undefined {
function resolveOpenAIGptForwardCompatModel(ctx: ProviderResolveDynamicModelContext) {
const trimmedModelId = ctx.modelId.trim();
const lower = normalizeLowercaseStringOrEmpty(trimmedModelId);
let templateIds: readonly string[];
@@ -286,7 +284,7 @@ export function buildOpenAIProvider(): ProviderPlugin {
}
return {
suppress: true,
errorMessage: `Unknown model: ${ctx.provider}/${OPENAI_DIRECT_SPARK_MODEL_ID}. ${OPENAI_DIRECT_SPARK_MODEL_ID} is only supported via openai-codex OAuth. Use openai-codex/${OPENAI_DIRECT_SPARK_MODEL_ID}.`,
errorMessage: `Unknown model: ${ctx.provider}/${OPENAI_DIRECT_SPARK_MODEL_ID}. ${OPENAI_DIRECT_SPARK_MODEL_ID} is only supported through Codex OAuth. Use openai/${OPENAI_DIRECT_SPARK_MODEL_ID} with the Codex OAuth profile.`,
};
},
augmentModelCatalog: (ctx) => {

View File

@@ -31,7 +31,7 @@ vi.mock("../model-suppression.js", () => ({
) {
return undefined;
}
return `Unknown model: ${provider}/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported via openai-codex OAuth. Use openai-codex/gpt-5.3-codex-spark.`;
return `Unknown model: ${provider}/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported through Codex OAuth. Use openai/gpt-5.3-codex-spark with the Codex OAuth profile.`;
},
}));
@@ -140,7 +140,7 @@ describe("resolveModel forward-compat errors and overrides", () => {
expect(result.model).toBeUndefined();
expect(result.error).toBe(
"Unknown model: openai/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported via openai-codex OAuth. Use openai-codex/gpt-5.3-codex-spark.",
"Unknown model: openai/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported through Codex OAuth. Use openai/gpt-5.3-codex-spark with the Codex OAuth profile.",
);
});
@@ -161,7 +161,7 @@ describe("resolveModel forward-compat errors and overrides", () => {
expect(result.model).toBeUndefined();
expect(result.error).toBe(
"Unknown model: openai/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported via openai-codex OAuth. Use openai-codex/gpt-5.3-codex-spark.",
"Unknown model: openai/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported through Codex OAuth. Use openai/gpt-5.3-codex-spark with the Codex OAuth profile.",
);
});
@@ -174,7 +174,7 @@ describe("resolveModel forward-compat errors and overrides", () => {
expect(result.model).toBeUndefined();
expect(result.error).toBe(
"Unknown model: azure-openai-responses/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported via openai-codex OAuth. Use openai-codex/gpt-5.3-codex-spark.",
"Unknown model: azure-openai-responses/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported through Codex OAuth. Use openai/gpt-5.3-codex-spark with the Codex OAuth profile.",
);
});

View File

@@ -13,7 +13,7 @@ vi.mock("../model-suppression.js", () => ({
) {
return undefined;
}
return `Unknown model: ${provider}/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported via openai-codex OAuth. Use openai-codex/gpt-5.3-codex-spark.`;
return `Unknown model: ${provider}/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported through Codex OAuth. Use openai/gpt-5.3-codex-spark with the Codex OAuth profile.`;
},
}));
@@ -1260,7 +1260,7 @@ describe("resolveModel", () => {
expect(result.model).toBeUndefined();
expect(result.error).toBe(
"Unknown model: openai/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported via openai-codex OAuth. Use openai-codex/gpt-5.3-codex-spark.",
"Unknown model: openai/gpt-5.3-codex-spark. gpt-5.3-codex-spark is only supported through Codex OAuth. Use openai/gpt-5.3-codex-spark with the Codex OAuth profile.",
);
});

View File

@@ -77,7 +77,9 @@ export function expectCodexBuiltInSuppression(
}),
).toMatchObject({
suppress: true,
errorMessage: expect.stringContaining("openai-codex/gpt-5.3-codex-spark"),
errorMessage: expect.stringContaining(
"openai/gpt-5.3-codex-spark with the Codex OAuth profile",
),
});
}

View File

@@ -134,7 +134,10 @@ function createOpenAiCatalogProviderPlugin(
suppressBuiltInModel: ({ provider, modelId }) =>
(provider === "openai" || provider === "azure-openai-responses") &&
modelId === "gpt-5.3-codex-spark"
? { suppress: true, errorMessage: "openai-codex/gpt-5.3-codex-spark" }
? {
suppress: true,
errorMessage: "openai/gpt-5.3-codex-spark with the Codex OAuth profile",
}
: undefined,
augmentModelCatalog: () => [
{ provider: "openai", id: "gpt-5.4", name: "gpt-5.4" },