Files
openclaw/extensions/openai/model-route-contract.test.ts
Peter Steinberger 1b1cebfe42 fix(openai): align auth availability with effective routes (#104685)
* feat(openai): add provider-owned route facts

* fix(openai): harden provider route facts

* test(codex): update rebased auth fixtures

* chore: leave release notes to release workflow

* fix(openai): align route auth with current contracts

* test(openai): align route and shard expectations

* test(openai): satisfy route fixture contracts

* fix(openai): preserve direct profile forwarding

* test(models): complete route auth mocks

* test(codex): type compaction factory mock

* fix(openai): preserve provider-native model ids

* test(agents): align route auth fixtures

* style(agents): format route integrations

* test(plugin-sdk): pin current surface counts
2026-07-11 15:26:48 -07:00

76 lines
2.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
OPENAI_CHATGPT_MODERN_MODEL_IDS,
OPENAI_DUAL_ROUTE_MODEL_IDS,
OPENAI_PLATFORM_ONLY_ROUTE_MODEL_IDS,
OPENAI_PROVIDER_MODERN_MODEL_IDS,
OPENAI_SUBSCRIPTION_ONLY_ROUTE_MODEL_IDS,
isOpenAIDualRouteModelId,
isOpenAIPlatformOnlyRouteModelId,
isOpenAISubscriptionOnlyRouteModelId,
normalizeOpenAIModelRouteId,
} from "./model-route-contract.js";
import { buildOpenAICodexProviderHooks } from "./openai-chatgpt-provider.js";
import { buildOpenAIProvider } from "./openai-provider.js";
import { resolveModelRoutes } from "./provider-policy-api.js";
function resolveUnconfiguredModel(modelId: string) {
return resolveModelRoutes({
provider: "openai",
modelId,
env: {},
});
}
describe("OpenAI model route contract", () => {
it("preserves custom model spelling while matching built-in routes case-insensitively", () => {
expect(normalizeOpenAIModelRouteId(" openai/Future-MODEL ")).toBe("openai/Future-MODEL");
expect(normalizeOpenAIModelRouteId("future-model")).toBe("future-model");
expect(normalizeOpenAIModelRouteId("GPT-5.4-CODEX")).toBe("gpt-5.4");
expect(isOpenAIDualRouteModelId("GPT-5.5")).toBe(true);
expect(isOpenAIPlatformOnlyRouteModelId("CHAT-LATEST")).toBe(true);
expect(isOpenAISubscriptionOnlyRouteModelId("GPT-5.3-CODEX-SPARK")).toBe(true);
});
it("keeps route eligibility aligned with both provider runtime surfaces", () => {
const provider = buildOpenAIProvider();
const chatGPTHooks = buildOpenAICodexProviderHooks();
const routeModelIds = [
...OPENAI_DUAL_ROUTE_MODEL_IDS,
...OPENAI_PLATFORM_ONLY_ROUTE_MODEL_IDS,
...OPENAI_SUBSCRIPTION_ONLY_ROUTE_MODEL_IDS,
];
expect(new Set(routeModelIds).size).toBe(routeModelIds.length);
for (const modelId of OPENAI_PROVIDER_MODERN_MODEL_IDS) {
expect(provider.isModernModelRef?.({ provider: "openai", modelId })).toBe(true);
}
for (const modelId of OPENAI_CHATGPT_MODERN_MODEL_IDS) {
expect(chatGPTHooks.isModernModelRef?.({ provider: "openai", modelId })).toBe(true);
}
for (const modelId of OPENAI_DUAL_ROUTE_MODEL_IDS) {
const resolution = resolveUnconfiguredModel(modelId);
expect(
resolution.kind === "routes" ? resolution.routes.map((route) => route.api) : [],
).toEqual(["openai-responses", "openai-chatgpt-responses"]);
}
for (const modelId of OPENAI_PLATFORM_ONLY_ROUTE_MODEL_IDS) {
expect(resolveUnconfiguredModel(modelId)).toMatchObject({
kind: "routes",
defaultRuntimeId: "codex",
routes: [{ api: "openai-responses", authRequirement: "api-key" }],
});
}
for (const modelId of OPENAI_SUBSCRIPTION_ONLY_ROUTE_MODEL_IDS) {
expect(resolveUnconfiguredModel(modelId)).toMatchObject({
kind: "routes",
defaultRuntimeId: "codex",
routes: [{ api: "openai-chatgpt-responses", authRequirement: "subscription" }],
});
}
});
});