



























@@ -188,6 +188,64 @@ describe("models-config", () => {
188188expect(observedSnapshot).toBe(pluginMetadataSnapshot);
189189});
190190191+it("normalizes retired Gemini ids preserved from existing models.json rows", async () => {
192+const plan = await planOpenClawModelsJsonWithDeps(
193+{
194+cfg: { models: { mode: "merge", providers: {} } },
195+agentDir: "/tmp/openclaw-models-config-env-vars-test",
196+env: {},
197+existingRaw: "",
198+existingParsed: {
199+providers: {
200+google: {
201+baseUrl: "https://generativelanguage.googleapis.com/v1beta",
202+api: "google-generative-ai",
203+apiKey: "GOOGLE_API_KEY", // pragma: allowlist secret
204+models: [
205+{
206+id: "gemini-3-pro-preview",
207+name: "Gemini 3 Pro",
208+input: ["text"],
209+},
210+],
211+},
212+},
213+},
214+},
215+{
216+resolveImplicitProviders: async () => ({
217+openai: {
218+baseUrl: "https://api.openai.com/v1",
219+api: "openai-responses",
220+apiKey: "OPENAI_API_KEY", // pragma: allowlist secret
221+models: [
222+{
223+id: "gpt-5.5",
224+name: "GPT-5.5",
225+input: ["text"],
226+reasoning: true,
227+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
228+contextWindow: 400000,
229+maxTokens: 128000,
230+},
231+],
232+},
233+}),
234+},
235+);
236+237+expect(plan.action).toBe("write");
238+if (plan.action !== "write") {
239+throw new Error("Expected models.json write plan");
240+}
241+const parsed = JSON.parse(plan.contents) as {
242+providers?: Record<string, { models?: Array<{ id?: string }> }>;
243+};
244+expect(parsed.providers?.google?.models?.map((model) => model.id)).toEqual([
245+"gemini-3.1-pro-preview",
246+]);
247+});
248+191249it("uses config env.vars entries for implicit provider discovery without mutating process.env", async () => {
192250await withTempEnv(["OPENROUTER_API_KEY", TEST_ENV_VAR], async () => {
193251unsetEnv(["OPENROUTER_API_KEY", TEST_ENV_VAR]);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。