


























11import { describe, expect, it, vi } from "vitest";
22import type { OpenClawConfig } from "../config/types.openclaw.js";
33import type { Model } from "../llm/types.js";
4+5+vi.mock("./agent-model-discovery.js", () => ({
6+normalizeDiscoveredAgentModel: (value: unknown) => value,
7+}));
8+49import { appendPrioritizedDynamicLiveModels } from "./live-model-dynamic-candidates.js";
510611const REGISTRY = { find: () => undefined } as never;
12+const DYNAMIC_PROVIDER = "dynamic-test-provider";
713type DynamicModelResolver = NonNullable<
814Parameters<typeof appendPrioritizedDynamicLiveModels>[0]["resolveDynamicModel"]
915>;
@@ -29,15 +35,15 @@ function model(provider: string, id: string): Model {
2935describe("appendPrioritizedDynamicLiveModels", () => {
3036it("materializes prioritized refs from provider dynamic model hooks", async () => {
3137const resolveDynamicModel: DynamicModelResolver = vi.fn((params) =>
32-params.context.provider === "opencode-go" && params.context.modelId === "glm-5"
33- ? model("opencode-go", "glm-5")
38+params.context.provider === DYNAMIC_PROVIDER && params.context.modelId === "glm-5"
39+ ? model(DYNAMIC_PROVIDER, "glm-5")
3440 : undefined,
3541);
3642const prepareDynamicModel: DynamicModelPreparer = vi.fn(async () => undefined);
3743const config = {
3844models: {
3945providers: {
40-"opencode-go": {
46+[DYNAMIC_PROVIDER]: {
4147api: "openai-completions",
4248baseUrl: "https://configured.example/v1",
4349models: [],
@@ -55,56 +61,56 @@ describe("appendPrioritizedDynamicLiveModels", () => {
5561 prepareDynamicModel,
5662refs: [
5763{ provider: "anthropic", id: "claude-sonnet-4-6" },
58-{ provider: "opencode-go", id: "glm-5" },
64+{ provider: DYNAMIC_PROVIDER, id: "glm-5" },
5965],
6066});
61676268expect(result.added.map((entry) => `${entry.provider}/${entry.id}`)).toEqual([
63-"opencode-go/glm-5",
69+`${DYNAMIC_PROVIDER}/glm-5`,
6470]);
6571expect(result.models.map((entry) => `${entry.provider}/${entry.id}`)).toEqual([
6672"anthropic/claude-sonnet-4-6",
67-"opencode-go/glm-5",
73+`${DYNAMIC_PROVIDER}/glm-5`,
6874]);
6975expect(prepareDynamicModel).toHaveBeenCalledTimes(1);
7076expect(prepareDynamicModel).toHaveBeenCalledWith(
7177expect.objectContaining({
72-provider: "opencode-go",
78+provider: DYNAMIC_PROVIDER,
7379context: expect.objectContaining({
7480agentDir: "/tmp/openclaw-agent",
7581modelId: "glm-5",
7682modelRegistry: REGISTRY,
77-provider: "opencode-go",
78-providerConfig: config.models?.providers?.["opencode-go"],
83+provider: DYNAMIC_PROVIDER,
84+providerConfig: config.models?.providers?.[DYNAMIC_PROVIDER],
7985}),
8086}),
8187);
8288expect(resolveDynamicModel).toHaveBeenCalledTimes(1);
8389expect(resolveDynamicModel).toHaveBeenCalledWith(
8490expect.objectContaining({
85-provider: "opencode-go",
91+provider: DYNAMIC_PROVIDER,
8692context: expect.objectContaining({
8793agentDir: "/tmp/openclaw-agent",
8894modelId: "glm-5",
8995modelRegistry: REGISTRY,
90-provider: "opencode-go",
91-providerConfig: config.models?.providers?.["opencode-go"],
96+provider: DYNAMIC_PROVIDER,
97+providerConfig: config.models?.providers?.[DYNAMIC_PROVIDER],
9298}),
9399}),
94100);
95101});
9610297103it("does not duplicate refs already present in the generated registry", async () => {
98-const resolveDynamicModel: DynamicModelResolver = vi.fn(() => model("opencode-go", "glm-5"));
104+const resolveDynamicModel: DynamicModelResolver = vi.fn(() => model(DYNAMIC_PROVIDER, "glm-5"));
99105const prepareDynamicModel: DynamicModelPreparer = vi.fn(async () => undefined);
100106101107const result = await appendPrioritizedDynamicLiveModels({
102-models: [model("opencode-go", "glm-5")],
108+models: [model(DYNAMIC_PROVIDER, "glm-5")],
103109agentDir: "/tmp/openclaw-agent",
104110modelRegistry: REGISTRY,
105111 resolveDynamicModel,
106112 prepareDynamicModel,
107-refs: [{ provider: "opencode-go", id: "glm-5" }],
113+refs: [{ provider: DYNAMIC_PROVIDER, id: "glm-5" }],
108114});
109115110116expect(result.added).toEqual([]);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。