diff --git a/extensions/discord/src/monitor/model-picker.test.ts b/extensions/discord/src/monitor/model-picker.test.ts index de915be66bd1..166e7d92e828 100644 --- a/extensions/discord/src/monitor/model-picker.test.ts +++ b/extensions/discord/src/monitor/model-picker.test.ts @@ -1,6 +1,5 @@ import { serializePayload } from "@buape/carbon"; import { ComponentType } from "discord-api-types/v10"; -import * as modelsCommandModule from "openclaw/plugin-sdk/models-provider-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; import { @@ -21,6 +20,12 @@ import { } from "./model-picker.js"; import { createModelsProviderData } from "./model-picker.test-utils.js"; +const buildModelsProviderDataMock = vi.hoisted(() => vi.fn()); + +vi.mock("openclaw/plugin-sdk/models-provider-runtime", () => ({ + buildModelsProviderData: buildModelsProviderDataMock, +})); + type SerializedComponent = { type: number; custom_id?: string; @@ -71,14 +76,12 @@ describe("loadDiscordModelPickerData", () => { it("reuses buildModelsProviderData as source of truth with agent scope", async () => { const expected = createModelsProviderData({ openai: ["gpt-4o"] }); const cfg = {} as OpenClawConfig; - const spy = vi - .spyOn(modelsCommandModule, "buildModelsProviderData") - .mockResolvedValue(expected); + buildModelsProviderDataMock.mockResolvedValue(expected); const result = await loadDiscordModelPickerData(cfg, "support"); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith(cfg, "support"); + expect(buildModelsProviderDataMock).toHaveBeenCalledTimes(1); + expect(buildModelsProviderDataMock).toHaveBeenCalledWith(cfg, "support"); expect(result).toBe(expected); }); }); diff --git a/extensions/discord/src/monitor/model-picker.ts b/extensions/discord/src/monitor/model-picker.ts index 4a467eedfcde..af704883911a 100644 --- a/extensions/discord/src/monitor/model-picker.ts +++ b/extensions/discord/src/monitor/model-picker.ts @@ -12,11 +12,8 @@ import { import type { APISelectMenuOption } from "discord-api-types/v10"; import { ButtonStyle } from "discord-api-types/v10"; import { normalizeProviderId } from "openclaw/plugin-sdk/agent-runtime"; -import { - buildModelsProviderData, - type ModelsProviderData, -} from "openclaw/plugin-sdk/models-provider-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { ModelsProviderData } from "openclaw/plugin-sdk/models-provider-runtime"; export const DISCORD_MODEL_PICKER_CUSTOM_ID_KEY = "mdlpk"; export const DISCORD_CUSTOM_ID_MAX_CHARS = 100; @@ -142,6 +139,15 @@ export type DiscordModelPickerModelViewParams = { layout?: DiscordModelPickerLayout; }; +let modelsProviderRuntimePromise: + | Promise + | undefined; + +async function loadModelsProviderRuntime() { + modelsProviderRuntimePromise ??= import("openclaw/plugin-sdk/models-provider-runtime"); + return await modelsProviderRuntimePromise; +} + function encodeCustomIdValue(value: string): string { return encodeURIComponent(value); } @@ -544,6 +550,7 @@ export async function loadDiscordModelPickerData( cfg: OpenClawConfig, agentId?: string, ): Promise { + const { buildModelsProviderData } = await loadModelsProviderRuntime(); return buildModelsProviderData(cfg, agentId); }