Files
openclaw/src/agents/models-config.providers.policy.test.ts
2026-04-07 15:28:46 +01:00

104 lines
3.5 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
type NormalizeProviderSpecificConfig =
typeof import("./models-config.providers.policy.js").normalizeProviderSpecificConfig;
type ResolveProviderConfigApiKeyResolver =
typeof import("./models-config.providers.policy.js").resolveProviderConfigApiKeyResolver;
const GOOGLE_BASE_URL = "https://generativelanguage.googleapis.com";
let normalizeProviderSpecificConfig: NormalizeProviderSpecificConfig;
let resolveProviderConfigApiKeyResolver: ResolveProviderConfigApiKeyResolver;
vi.mock("../plugins/provider-runtime.js", () => ({
applyProviderNativeStreamingUsageCompatWithPlugin: () => undefined,
normalizeProviderConfigWithPlugin: (params: {
provider: string;
context: { providerConfig?: { baseUrl?: string } };
}) => {
if (params.provider !== "google") {
return undefined;
}
const baseUrl = params.context.providerConfig?.baseUrl?.trim();
if (!baseUrl || baseUrl.endsWith("/v1beta")) {
return undefined;
}
return {
...params.context.providerConfig,
baseUrl:
baseUrl === GOOGLE_BASE_URL
? `${GOOGLE_BASE_URL}/v1beta`
: params.context.providerConfig?.baseUrl,
};
},
resolveProviderConfigApiKeyWithPlugin: (params: {
provider: string;
context: { env: NodeJS.ProcessEnv };
}) => {
if (params.provider === "amazon-bedrock") {
return params.context.env.AWS_PROFILE?.trim() ? "AWS_PROFILE" : undefined;
}
if (params.provider === "anthropic-vertex") {
return params.context.env.ANTHROPIC_VERTEX_USE_GCP_METADATA === "true"
? "gcp-vertex-credentials"
: undefined;
}
return undefined;
},
}));
beforeEach(async () => {
vi.resetModules();
({ normalizeProviderSpecificConfig, resolveProviderConfigApiKeyResolver } =
await import("./models-config.providers.policy.js"));
});
describe("models-config.providers.policy", () => {
it("resolves config apiKey markers through provider plugin hooks", async () => {
const env = {
AWS_PROFILE: "default",
} as NodeJS.ProcessEnv;
const resolver = resolveProviderConfigApiKeyResolver("amazon-bedrock");
expect(resolver).toBeTypeOf("function");
expect(resolver?.(env)).toBe("AWS_PROFILE");
});
it("resolves anthropic-vertex ADC markers through provider plugin hooks", async () => {
const resolver = resolveProviderConfigApiKeyResolver("anthropic-vertex");
expect(resolver).toBeTypeOf("function");
expect(
resolver?.({
ANTHROPIC_VERTEX_USE_GCP_METADATA: "true",
} as NodeJS.ProcessEnv),
).toBe("gcp-vertex-credentials");
});
it("normalizes Google provider config through provider plugin hooks", async () => {
expect(
normalizeProviderSpecificConfig("google", {
api: "google-generative-ai",
baseUrl: "https://generativelanguage.googleapis.com",
models: [],
}),
).toMatchObject({
api: "google-generative-ai",
baseUrl: "https://generativelanguage.googleapis.com/v1beta",
});
});
it("does not treat generic transport APIs as provider plugin ids", () => {
const provider = {
api: "openai-completions" as const,
baseUrl: "https://example.invalid/v1",
apiKey: "EXAMPLE_KEY",
models: [],
};
const resolver = resolveProviderConfigApiKeyResolver("dashscope-vision", provider);
expect(resolver).toBeTypeOf("function");
expect(resolver?.({} as NodeJS.ProcessEnv)).toBeUndefined();
expect(normalizeProviderSpecificConfig("dashscope-vision", provider)).toBe(provider);
});
});