


















@@ -6,10 +6,10 @@ import type { OpenClawConfig } from "../config/config.js";
66import type { ModelDefinitionConfig } from "../config/types.models.js";
77import {
88normalizePluginDiscoveryResult,
9-resolvePluginDiscoveryProviders,
109runProviderCatalog,
1110} from "../plugins/provider-discovery.js";
1211import type { ProviderPlugin } from "../plugins/types.js";
12+import { loadBundledPluginPublicSurfaceSync } from "../test-utils/bundled-plugin-public-surface.js";
1313import { withFetchPreconnect } from "../test-utils/fetch-mock.js";
1414import { OLLAMA_LOCAL_AUTH_MARKER } from "./model-auth-markers.js";
1515import type { ProviderConfig } from "./models-config.providers.secrets.js";
@@ -48,42 +48,28 @@ describe("Ollama provider", () => {
4848}
4949}
505051-async function resolveProvidersWithOllamaOnly(params: {
52-agentDir: string;
53-explicitProviders?: Record<string, ProviderConfig>;
54-env?: NodeJS.ProcessEnv;
55-}) {
56-const env = {
57- ...process.env,
58-OPENCLAW_TEST_ONLY_PROVIDER_PLUGIN_IDS: "ollama",
59-VITEST: "1",
60-NODE_ENV: "test",
61- ...params.env,
62-} satisfies NodeJS.ProcessEnv;
51+let ollamaCatalogProvider: ProviderPlugin | undefined;
635264-const { resolveImplicitProviders } = await import("./models-config.providers.implicit.js");
65-return resolveImplicitProviders({
66-agentDir: params.agentDir,
67-explicitProviders: params.explicitProviders,
68- env,
53+function loadOllamaCatalogProvider(): ProviderPlugin | undefined {
54+if (ollamaCatalogProvider) {
55+return ollamaCatalogProvider;
56+}
57+const surface = loadBundledPluginPublicSurfaceSync<{
58+default?: ProviderPlugin;
59+ollamaProviderDiscovery?: ProviderPlugin;
60+}>({
61+pluginId: "ollama",
62+artifactBasename: "provider-discovery.js",
6963});
70-}
71-72-let ollamaCatalogProviderPromise: Promise<ProviderPlugin | undefined> | undefined;
73-74-async function loadOllamaCatalogProvider(): Promise<ProviderPlugin | undefined> {
75-ollamaCatalogProviderPromise ??= resolvePluginDiscoveryProviders({
76-env: { ...process.env, OPENCLAW_TEST_ONLY_PROVIDER_PLUGIN_IDS: "ollama", VITEST: "1" },
77-onlyPluginIds: ["ollama"],
78-}).then((providers) => providers.find((provider) => provider.id === "ollama"));
79-return ollamaCatalogProviderPromise;
64+ollamaCatalogProvider = surface.default ?? surface.ollamaProviderDiscovery;
65+return ollamaCatalogProvider;
8066}
81678268async function runOllamaCatalog(params: {
8369config?: OpenClawConfig;
8470env?: NodeJS.ProcessEnv;
8571}): Promise<ProviderConfig | undefined> {
86-const provider = await loadOllamaCatalogProvider();
72+const provider = loadOllamaCatalogProvider();
8773if (!provider) {
8874return undefined;
8975}
@@ -148,14 +134,23 @@ describe("Ollama provider", () => {
148134});
149135150136it("should use native ollama api type", async () => {
151-const agentDir = createAgentDir();
137+const fetchMock = vi.fn(async (input: unknown) => {
138+const url = String(input);
139+if (url.endsWith("/api/tags")) {
140+return tagsResponse([]);
141+}
142+return notFoundJsonResponse();
143+});
144+vi.stubGlobal("fetch", withFetchPreconnect(fetchMock));
145+152146await withOllamaApiKey(async () => {
153-const providers = await resolveProvidersWithOllamaOnly({ agentDir });
147+const provider = await runOllamaCatalog({});
154148155-expect(providers?.ollama).toBeDefined();
156-expect(providers?.ollama?.apiKey).toBe("OLLAMA_API_KEY");
157-expect(providers?.ollama?.api).toBe("ollama");
158-expect(providers?.ollama?.baseUrl).toBe("http://127.0.0.1:11434");
149+expect(provider).toBeDefined();
150+expect(provider?.apiKey).toBe("OLLAMA_API_KEY");
151+expect(provider?.api).toBe("ollama");
152+expect(provider?.baseUrl).toBe("http://127.0.0.1:11434");
153+expectDiscoveryCallCounts(fetchMock, { tags: 1, show: 0 });
159154});
160155});
161156此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。