mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-24 10:39:49 +00:00
236 lines
5.6 KiB
TypeScript
236 lines
5.6 KiB
TypeScript
import { afterEach, describe, expect, it } from "vitest";
|
|
import type { ModelDefinitionConfig } from "../config/types.models.js";
|
|
import type { OpenClawConfig } from "../config/types.openclaw.js";
|
|
import { resolveModelRuntimePolicy } from "./model-runtime-policy.js";
|
|
|
|
const ORIGINAL_BUILD_PRIVATE_QA = process.env.OPENCLAW_BUILD_PRIVATE_QA;
|
|
const ORIGINAL_QA_FORCE_RUNTIME = process.env.OPENCLAW_QA_FORCE_RUNTIME;
|
|
|
|
const createModelConfig = (agentRuntimeId: string): ModelDefinitionConfig => ({
|
|
id: "qwen-local",
|
|
name: "Qwen Local",
|
|
reasoning: false,
|
|
input: ["text"],
|
|
cost: {
|
|
input: 0,
|
|
output: 0,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
},
|
|
contextWindow: 32_768,
|
|
maxTokens: 4096,
|
|
agentRuntime: { id: agentRuntimeId },
|
|
});
|
|
|
|
function restoreEnv(
|
|
name: "OPENCLAW_BUILD_PRIVATE_QA" | "OPENCLAW_QA_FORCE_RUNTIME",
|
|
value: string | undefined,
|
|
): void {
|
|
if (value == null) {
|
|
delete process.env[name];
|
|
return;
|
|
}
|
|
process.env[name] = value;
|
|
}
|
|
|
|
function makeProviderRuntimeConfig(runtime: string): OpenClawConfig {
|
|
return {
|
|
models: {
|
|
providers: {
|
|
openai: {
|
|
baseUrl: "https://api.openai.example/v1",
|
|
agentRuntime: { id: runtime },
|
|
models: [],
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
}
|
|
|
|
afterEach(() => {
|
|
restoreEnv("OPENCLAW_BUILD_PRIVATE_QA", ORIGINAL_BUILD_PRIVATE_QA);
|
|
restoreEnv("OPENCLAW_QA_FORCE_RUNTIME", ORIGINAL_QA_FORCE_RUNTIME);
|
|
});
|
|
|
|
describe("resolveModelRuntimePolicy", () => {
|
|
it("ignores the QA force-runtime override when the private QA gate is unset", () => {
|
|
delete process.env.OPENCLAW_BUILD_PRIVATE_QA;
|
|
process.env.OPENCLAW_QA_FORCE_RUNTIME = "pi";
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config: makeProviderRuntimeConfig("codex"),
|
|
provider: "openai",
|
|
modelId: "gpt-5.5",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "codex" },
|
|
source: "provider",
|
|
});
|
|
});
|
|
|
|
it("respects the QA force-runtime override when the private QA gate is set", () => {
|
|
process.env.OPENCLAW_BUILD_PRIVATE_QA = "1";
|
|
process.env.OPENCLAW_QA_FORCE_RUNTIME = "pi";
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config: makeProviderRuntimeConfig("codex"),
|
|
provider: "openai",
|
|
modelId: "gpt-5.5",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "pi" },
|
|
source: "model",
|
|
});
|
|
});
|
|
|
|
it("ignores invalid QA force-runtime values even when the private QA gate is set", () => {
|
|
process.env.OPENCLAW_BUILD_PRIVATE_QA = "1";
|
|
process.env.OPENCLAW_QA_FORCE_RUNTIME = "bogus";
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config: makeProviderRuntimeConfig("codex"),
|
|
provider: "openai",
|
|
modelId: "gpt-5.5",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "codex" },
|
|
source: "provider",
|
|
});
|
|
});
|
|
|
|
it("honors provider wildcard agent model runtime policy entries", () => {
|
|
const config = {
|
|
agents: {
|
|
defaults: {
|
|
models: {
|
|
"vllm/*": { agentRuntime: { id: "pi" } },
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config,
|
|
provider: "vllm",
|
|
modelId: "qwen-local",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "pi" },
|
|
source: "model",
|
|
});
|
|
});
|
|
|
|
it("honors provider wildcard agent model runtime policy entries without a concrete model id", () => {
|
|
const config = {
|
|
agents: {
|
|
defaults: {
|
|
models: {
|
|
"vllm/*": { agentRuntime: { id: "pi" } },
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config,
|
|
provider: "vllm",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "pi" },
|
|
source: "model",
|
|
});
|
|
});
|
|
|
|
it("prefers exact agent model runtime policy entries over provider wildcards", () => {
|
|
const config = {
|
|
agents: {
|
|
defaults: {
|
|
models: {
|
|
"vllm/*": { agentRuntime: { id: "pi" } },
|
|
"vllm/qwen-local": { agentRuntime: { id: "codex" } },
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config,
|
|
provider: "vllm",
|
|
modelId: "qwen-local",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "codex" },
|
|
source: "model",
|
|
});
|
|
});
|
|
|
|
it("prefers exact provider model runtime policy over agent provider wildcards", () => {
|
|
const config = {
|
|
agents: {
|
|
defaults: {
|
|
models: {
|
|
"vllm/*": { agentRuntime: { id: "pi" } },
|
|
},
|
|
},
|
|
},
|
|
models: {
|
|
providers: {
|
|
vllm: {
|
|
baseUrl: "http://127.0.0.1:11434/v1",
|
|
models: [createModelConfig("codex")],
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config,
|
|
provider: "vllm",
|
|
modelId: "qwen-local",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "codex" },
|
|
source: "model",
|
|
});
|
|
});
|
|
|
|
it("prefers agent provider wildcard runtime policy over provider runtime policy", () => {
|
|
const config = {
|
|
agents: {
|
|
defaults: {
|
|
models: {
|
|
"vllm/*": { agentRuntime: { id: "pi" } },
|
|
},
|
|
},
|
|
},
|
|
models: {
|
|
providers: {
|
|
vllm: {
|
|
baseUrl: "http://127.0.0.1:11434/v1",
|
|
agentRuntime: { id: "codex" },
|
|
models: [],
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
|
|
expect(
|
|
resolveModelRuntimePolicy({
|
|
config,
|
|
provider: "vllm",
|
|
modelId: "qwen-local",
|
|
}),
|
|
).toEqual({
|
|
policy: { id: "pi" },
|
|
source: "model",
|
|
});
|
|
});
|
|
});
|