

























@@ -0,0 +1,86 @@
1+import { readFileSync } from "node:fs";
2+import { describe, expect, it } from "vitest";
3+4+type GoogleManifest = {
5+modelCatalog?: {
6+suppressions?: Array<{
7+provider?: string;
8+model?: string;
9+reason?: string;
10+}>;
11+};
12+};
13+14+const RETIRED_GEMINI_CHAT_MODELS = [
15+"gemini-1.5-flash",
16+"gemini-1.5-flash-8b",
17+"gemini-1.5-pro",
18+"gemini-2.0-flash-exp",
19+"gemini-2.0-flash-exp-image-generation",
20+"gemini-2.0-flash-live-001",
21+"gemini-2.0-flash-lite-preview",
22+"gemini-2.0-flash-lite-preview-02-05",
23+"gemini-2.0-flash-preview-image-generation",
24+"gemini-2.0-flash-thinking-exp",
25+"gemini-2.0-flash-thinking-exp-01-21",
26+"gemini-2.0-flash-thinking-exp-1219",
27+"gemini-2.0-pro-exp",
28+"gemini-2.0-pro-exp-02-05",
29+"gemini-2.5-flash-exp-native-audio-thinking-dialog",
30+"gemini-2.5-flash-image-preview",
31+"gemini-2.5-flash-lite-preview-06-17",
32+"gemini-2.5-flash-lite-preview-09-25",
33+"gemini-2.5-flash-lite-preview-09-2025",
34+"gemini-2.5-flash-preview-04-17",
35+"gemini-2.5-flash-preview-05-20",
36+"gemini-2.5-flash-preview-09-25",
37+"gemini-2.5-flash-preview-09-2025",
38+"gemini-2.5-flash-preview-native-audio-dialog",
39+"gemini-2.5-pro-exp-03-25",
40+"gemini-2.5-pro-preview-03-25",
41+"gemini-2.5-pro-preview-05-06",
42+"gemini-2.5-pro-preview-06-05",
43+"gemini-3-pro-preview",
44+"gemini-3.1-pro-preview-customtools",
45+"gemini-live-2.5-flash",
46+"gemini-live-2.5-flash-preview",
47+"gemini-live-2.5-flash-preview-native-audio",
48+] as const;
49+50+const GOOGLE_CHAT_PROVIDERS = ["google", "google-gemini-cli", "google-vertex"] as const;
51+52+function loadManifest(): GoogleManifest {
53+return JSON.parse(readFileSync(new URL("./openclaw.plugin.json", import.meta.url), "utf8"));
54+}
55+56+describe("google manifest model catalog", () => {
57+it("suppresses retired Gemini chat model identifiers for all Google chat providers", () => {
58+const manifest = loadManifest();
59+const suppressionRefs = new Set(
60+(manifest.modelCatalog?.suppressions ?? []).map(
61+(suppression) => `${suppression.provider}/${suppression.model}`,
62+),
63+);
64+65+for (const provider of GOOGLE_CHAT_PROVIDERS) {
66+for (const model of RETIRED_GEMINI_CHAT_MODELS) {
67+expect(suppressionRefs).toContain(`${provider}/${model}`);
68+}
69+}
70+});
71+72+it("does not suppress still-callable Google replacement models", () => {
73+const manifest = loadManifest();
74+const suppressionRefs = new Set(
75+(manifest.modelCatalog?.suppressions ?? []).map(
76+(suppression) => `${suppression.provider}/${suppression.model}`,
77+),
78+);
79+80+expect(suppressionRefs).not.toContain("google/gemini-2.0-flash");
81+expect(suppressionRefs).not.toContain("google/gemini-2.5-flash");
82+expect(suppressionRefs).not.toContain("google/gemini-2.5-flash-lite");
83+expect(suppressionRefs).not.toContain("google/gemini-2.5-pro");
84+expect(suppressionRefs).not.toContain("google/gemini-3.1-pro-preview");
85+});
86+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。