Skip to content

Commit 432312a

Browse files
test: cover Vertex API key model config
Adds regression coverage for Google Vertex API-key model config planning when the credential comes from an env-backed auth profile. This keeps the planner-level guard around the Vertex static catalog rows that fixed #88816 on main. Verification: - `node scripts/run-vitest.mjs src/agents/models-config.applies-config-env-vars.test.ts extensions/google/provider-catalog.test.ts extensions/google/provider-models.test.ts` - `./node_modules/.bin/oxfmt --check --threads=1 src/agents/models-config.applies-config-env-vars.test.ts extensions/ollama/src/stream.ts extensions/qa-lab/src/mantis/slack-desktop-smoke.runtime.ts extensions/qa-lab/src/mantis/telegram-desktop-builder.runtime.ts extensions/qa-lab/src/mantis/visual-task.runtime.ts` - `git diff --check` - `pnpm deadcode:dependencies` CI note: PR CI had an unrelated `check-dependencies` failure for `ui/package.json: three`; the PR diff is one `src/agents` test file. Refs #88816
1 parent 5443baa commit 432312a

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

src/agents/models-config.applies-config-env-vars.test.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import fs from "node:fs/promises";
2+
import os from "node:os";
3+
import path from "node:path";
14
import { beforeAll, describe, expect, it } from "vitest";
25
import type { OpenClawConfig } from "../config/config.js";
36
import { createConfigRuntimeEnv } from "../config/env-vars.js";
@@ -50,6 +53,24 @@ function createImplicitOpenAiProvider(overrides: Partial<ProviderConfig> = {}):
5053
};
5154
}
5255

56+
function createImplicitGoogleVertexProvider(): ProviderConfig {
57+
return {
58+
baseUrl: "https://{location}-aiplatform.googleapis.com",
59+
api: "google-vertex",
60+
models: [
61+
{
62+
id: "gemini-2.5-pro",
63+
name: "Gemini 2.5 Pro",
64+
reasoning: true,
65+
input: ["text", "image"],
66+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
67+
contextWindow: 1_048_576,
68+
maxTokens: 65_536,
69+
},
70+
],
71+
};
72+
}
73+
5374
async function resolveProvidersForConfigEnvTest(params: {
5475
cfg: OpenClawConfig;
5576
onResolveImplicitProviders: (env: NodeJS.ProcessEnv) => void;
@@ -403,6 +424,72 @@ describe("models-config", () => {
403424
]);
404425
});
405426

427+
it("keeps google-vertex static catalog rows when an auth profile supplies the API key", async () => {
428+
const agentDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-google-vertex-models-"));
429+
try {
430+
await fs.writeFile(
431+
path.join(agentDir, "auth-profiles.json"),
432+
`${JSON.stringify(
433+
{
434+
version: 1,
435+
profiles: {
436+
"google-vertex:default": {
437+
type: "api_key",
438+
provider: "google-vertex",
439+
keyRef: { source: "env", provider: "default", id: "GOOGLE_CLOUD_API_KEY" },
440+
},
441+
},
442+
},
443+
null,
444+
2,
445+
)}\n`,
446+
);
447+
448+
const plan = await planOpenClawModelsJsonWithDeps(
449+
{
450+
cfg: {
451+
agents: {
452+
defaults: {
453+
models: {
454+
"google-vertex/gemini-2.5-pro": {},
455+
},
456+
model: { primary: "google-vertex/gemini-2.5-pro" },
457+
},
458+
},
459+
models: { providers: {} },
460+
},
461+
agentDir,
462+
env: {},
463+
existingRaw: "",
464+
existingParsed: null,
465+
},
466+
{
467+
resolveImplicitProviders: async () => ({
468+
"google-vertex": createImplicitGoogleVertexProvider(),
469+
}),
470+
},
471+
);
472+
473+
expect(plan.action).toBe("write");
474+
if (plan.action !== "write") {
475+
throw new Error("Expected models.json write plan");
476+
}
477+
const parsed = JSON.parse(plan.contents) as {
478+
providers?: Record<
479+
string,
480+
{ apiKey?: string; api?: string; models?: Array<{ id?: string }> }
481+
>;
482+
};
483+
expect(parsed.providers?.["google-vertex"]?.api).toBe("google-vertex");
484+
expect(parsed.providers?.["google-vertex"]?.apiKey).toBe("GOOGLE_CLOUD_API_KEY");
485+
expect(parsed.providers?.["google-vertex"]?.models?.map((model) => model.id)).toEqual([
486+
"gemini-2.5-pro",
487+
]);
488+
} finally {
489+
await fs.rm(agentDir, { recursive: true, force: true });
490+
}
491+
});
492+
406493
it("uses config env.vars entries for implicit provider discovery without mutating process.env", async () => {
407494
await withTempEnv(["OPENROUTER_API_KEY", TEST_ENV_VAR], async () => {
408495
unsetEnv(["OPENROUTER_API_KEY", TEST_ENV_VAR]);

0 commit comments

Comments
 (0)