


























@@ -19,17 +19,41 @@ let readFileMock: ReturnType<typeof vi.fn>;
19192020vi.mock("./model-suppression.runtime.js", () => ({
2121shouldSuppressBuiltInModel: (params: { provider?: string; id?: string }) =>
22-(params.provider === "openai" ||
23-params.provider === "azure-openai-responses" ||
24-params.provider === "openai-codex") &&
25-params.id === "gpt-5.3-codex-spark",
22+isSuppressedModel(params.provider, params.id),
2623buildShouldSuppressBuiltInModel: () => (params: { provider?: string; id?: string }) =>
27-(params.provider === "openai" ||
28-params.provider === "azure-openai-responses" ||
29-params.provider === "openai-codex") &&
30-params.id === "gpt-5.3-codex-spark",
24+isSuppressedModel(params.provider, params.id),
3125}));
322627+function isSuppressedModel(provider?: string, id?: string): boolean {
28+const modelId = id?.trim().toLowerCase();
29+if (!modelId) {
30+return false;
31+}
32+if (
33+(provider === "openai" ||
34+provider === "azure-openai-responses" ||
35+provider === "openai-codex") &&
36+modelId === "gpt-5.3-codex-spark"
37+) {
38+return true;
39+}
40+return (
41+provider === "openai-codex" &&
42+[
43+"gpt-5.1",
44+"gpt-5.1-codex",
45+"gpt-5.1-codex-mini",
46+"gpt-5.1-codex-max",
47+"gpt-5.2",
48+"gpt-5.2-codex",
49+"gpt-5.2-pro",
50+"gpt-5.3",
51+"gpt-5.3-codex",
52+"gpt-5.3-chat-latest",
53+].includes(modelId)
54+);
55+}
56+3357function mockCatalogImportFailThenRecover() {
3458let call = 0;
3559__setModelCatalogImportForTest(async () => {
@@ -524,6 +548,57 @@ describe("loadModelCatalog", () => {
524548);
525549});
526550551+it("filters stale openai-codex 5.1/5.2/5.3 built-ins from the catalog", async () => {
552+mockPiDiscoveryModels([
553+{
554+id: "gpt-5.1-codex-mini",
555+provider: "openai-codex",
556+name: "GPT-5.1 Codex Mini",
557+reasoning: true,
558+contextWindow: 400000,
559+input: ["text", "image"],
560+},
561+{
562+id: "gpt-5.2-codex",
563+provider: "openai-codex",
564+name: "GPT-5.2 Codex",
565+reasoning: true,
566+contextWindow: 400000,
567+input: ["text", "image"],
568+},
569+{
570+id: "gpt-5.3-codex",
571+provider: "openai-codex",
572+name: "GPT-5.3 Codex",
573+reasoning: true,
574+contextWindow: 400000,
575+input: ["text", "image"],
576+},
577+{
578+id: "gpt-5.5",
579+provider: "openai-codex",
580+name: "GPT-5.5",
581+reasoning: true,
582+contextWindow: 400000,
583+input: ["text", "image"],
584+},
585+]);
586+587+const result = await loadModelCatalog({ config: {} as OpenClawConfig });
588+expect(result).not.toContainEqual(
589+expect.objectContaining({ provider: "openai-codex", id: "gpt-5.1-codex-mini" }),
590+);
591+expect(result).not.toContainEqual(
592+expect.objectContaining({ provider: "openai-codex", id: "gpt-5.2-codex" }),
593+);
594+expect(result).not.toContainEqual(
595+expect.objectContaining({ provider: "openai-codex", id: "gpt-5.3-codex" }),
596+);
597+expect(result).toContainEqual(
598+expect.objectContaining({ provider: "openai-codex", id: "gpt-5.5" }),
599+);
600+});
601+527602it("does not synthesize gpt-5.4 OpenAI forward-compat entries from template models", async () => {
528603mockPiDiscoveryModels([
529604{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。