refactor(plugins): lazy load provider runtime shims

This commit is contained in:
Peter Steinberger 2026-03-15 18:20:29 -07:00
parent b54e37c71f
commit 74a57ace10
No known key found for this signature in database
5 changed files with 33 additions and 5 deletions

View File

@ -6,7 +6,6 @@ import type { ModelProviderAuthMode, ModelProviderConfig } from "../config/types
import { coerceSecretRef } from "../config/types.secrets.js";
import { getShellEnvAppliedKeys } from "../infra/shell-env.js";
import { createSubsystemLogger } from "../logging/subsystem.js";
import { buildProviderMissingAuthMessageWithPlugin } from "../plugins/provider-runtime.js";
import {
normalizeOptionalSecretInput,
normalizeSecretInput,
@ -36,6 +35,14 @@ const AWS_BEARER_ENV = "AWS_BEARER_TOKEN_BEDROCK";
const AWS_ACCESS_KEY_ENV = "AWS_ACCESS_KEY_ID";
const AWS_SECRET_KEY_ENV = "AWS_SECRET_ACCESS_KEY";
const AWS_PROFILE_ENV = "AWS_PROFILE";
let providerRuntimePromise:
| Promise<typeof import("../plugins/provider-runtime.runtime.js")>
| undefined;
function loadProviderRuntime() {
providerRuntimePromise ??= import("../plugins/provider-runtime.runtime.js");
return providerRuntimePromise;
}
function resolveProviderConfig(
cfg: OpenClawConfig | undefined,
@ -359,6 +366,7 @@ export async function resolveApiKeyForProvider(params: {
return resolveAwsSdkAuthInfo();
}
const { buildProviderMissingAuthMessageWithPlugin } = await loadProviderRuntime();
const pluginMissingAuthMessage = buildProviderMissingAuthMessageWithPlugin({
provider,
config: cfg,

View File

@ -1,8 +1,6 @@
import { type OpenClawConfig, loadConfig } from "../config/config.js";
import { createSubsystemLogger } from "../logging/subsystem.js";
import { augmentModelCatalogWithProviderPlugins } from "../plugins/provider-runtime.js";
import { resolveOpenClawAgentDir } from "./agent-paths.js";
import { shouldSuppressBuiltInModel } from "./model-suppression.js";
import { ensureOpenClawModelsJson } from "./models-config.js";
const log = createSubsystemLogger("model-catalog");
@ -33,9 +31,23 @@ let modelCatalogPromise: Promise<ModelCatalogEntry[]> | null = null;
let hasLoggedModelCatalogError = false;
const defaultImportPiSdk = () => import("./pi-model-discovery-runtime.js");
let importPiSdk = defaultImportPiSdk;
let providerRuntimePromise:
| Promise<typeof import("../plugins/provider-runtime.runtime.js")>
| undefined;
let modelSuppressionPromise: Promise<typeof import("./model-suppression.runtime.js")> | undefined;
const NON_PI_NATIVE_MODEL_PROVIDERS = new Set(["kilocode"]);
function loadProviderRuntime() {
providerRuntimePromise ??= import("../plugins/provider-runtime.runtime.js");
return providerRuntimePromise;
}
function loadModelSuppression() {
modelSuppressionPromise ??= import("./model-suppression.runtime.js");
return modelSuppressionPromise;
}
function normalizeConfiguredModelInput(input: unknown): ModelInputType[] | undefined {
if (!Array.isArray(input)) {
return undefined;
@ -160,6 +172,8 @@ export async function loadModelCatalog(params?: {
// will keep failing until restart).
const piSdk = await importPiSdk();
const agentDir = resolveOpenClawAgentDir();
const [{ shouldSuppressBuiltInModel }, { augmentModelCatalogWithProviderPlugins }] =
await Promise.all([loadModelSuppression(), loadProviderRuntime()]);
const { join } = await import("node:path");
const authStorage = piSdk.discoverAuthStorage(agentDir);
const registry = new (piSdk.ModelRegistry as unknown as {

View File

@ -0,0 +1 @@
export { shouldSuppressBuiltInModel } from "./model-suppression.js";

View File

@ -0,0 +1,4 @@
export {
augmentModelCatalogWithProviderPlugins,
buildProviderMissingAuthMessageWithPlugin,
} from "./provider-runtime.js";

View File

@ -81,8 +81,9 @@ describe("provider-runtime", () => {
displayName: "Demo",
windows: [{ label: "Day", usedPercent: 25 }],
}));
resolvePluginProvidersMock.mockImplementation((params?: { onlyPluginIds?: string[] }) => {
if (params?.onlyPluginIds?.includes("openai")) {
resolvePluginProvidersMock.mockImplementation((params: unknown) => {
const scopedParams = params as { onlyPluginIds?: string[] } | undefined;
if (scopedParams?.onlyPluginIds?.includes("openai")) {
return [
{
id: "openai",