diff --git a/extensions/memory-core/src/memory/embeddings-ollama.ts b/extensions/memory-core/src/memory/embeddings-ollama.ts deleted file mode 100644 index 486297a4880..00000000000 --- a/extensions/memory-core/src/memory/embeddings-ollama.ts +++ /dev/null @@ -1 +0,0 @@ -export { DEFAULT_OLLAMA_EMBEDDING_MODEL } from "./embeddings.js"; diff --git a/extensions/memory-core/src/memory/manager.mistral-provider.test.ts b/extensions/memory-core/src/memory/manager.mistral-provider.test.ts index 1f4f9f85342..972092f8c7b 100644 --- a/extensions/memory-core/src/memory/manager.mistral-provider.test.ts +++ b/extensions/memory-core/src/memory/manager.mistral-provider.test.ts @@ -3,7 +3,7 @@ import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/memory-core-host-engine-foundation"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { DEFAULT_OLLAMA_EMBEDDING_MODEL } from "./embeddings-ollama.js"; +import { DEFAULT_OLLAMA_EMBEDDING_MODEL } from "./embeddings.js"; import type { EmbeddingProvider, EmbeddingProviderRuntime, diff --git a/package.json b/package.json index 8d1bd44074c..34b6ff3b290 100644 --- a/package.json +++ b/package.json @@ -44,10 +44,6 @@ "types": "./dist/plugin-sdk/core.d.ts", "default": "./dist/plugin-sdk/core.js" }, - "./plugin-sdk/ollama-setup": { - "types": "./dist/plugin-sdk/ollama-setup.d.ts", - "default": "./dist/plugin-sdk/ollama-setup.js" - }, "./plugin-sdk/provider-setup": { "types": "./dist/plugin-sdk/provider-setup.d.ts", "default": "./dist/plugin-sdk/provider-setup.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index c7713ad9852..0bd127a6a0c 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -1,7 +1,6 @@ [ "index", "core", - "ollama-setup", "provider-setup", "sandbox", "self-hosted-provider-setup", diff --git a/src/agents/ollama-defaults.ts b/src/agents/ollama-defaults.ts deleted file mode 100644 index 67e1e38b072..00000000000 --- a/src/agents/ollama-defaults.ts +++ /dev/null @@ -1 +0,0 @@ -export { OLLAMA_DEFAULT_BASE_URL } from "../plugin-sdk/provider-models.js"; diff --git a/src/agents/ollama-models.test.ts b/src/agents/ollama-models.test.ts index d7b7d066c6f..33f7847f8f8 100644 --- a/src/agents/ollama-models.test.ts +++ b/src/agents/ollama-models.test.ts @@ -1,10 +1,10 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { jsonResponse, requestBodyText, requestUrl } from "../test-helpers/http.js"; import { enrichOllamaModelsWithContext, resolveOllamaApiBase, type OllamaTagModel, -} from "./ollama-models.js"; +} from "../../extensions/ollama/src/provider-models.js"; +import { jsonResponse, requestBodyText, requestUrl } from "../test-helpers/http.js"; describe("ollama-models", () => { afterEach(() => { diff --git a/src/agents/ollama-models.ts b/src/agents/ollama-models.ts deleted file mode 100644 index 44c8952a064..00000000000 --- a/src/agents/ollama-models.ts +++ /dev/null @@ -1,18 +0,0 @@ -export type { - OllamaModelWithContext, - OllamaTagModel, - OllamaTagsResponse, -} from "../plugin-sdk/provider-models.js"; -export { - buildOllamaModelDefinition, - enrichOllamaModelsWithContext, - fetchOllamaModels, - queryOllamaContextWindow, - resolveOllamaApiBase, -} from "../plugin-sdk/provider-models.js"; -export { isReasoningModelHeuristic } from "../plugin-sdk/provider-reasoning.js"; -export { - OLLAMA_DEFAULT_CONTEXT_WINDOW, - OLLAMA_DEFAULT_COST, - OLLAMA_DEFAULT_MAX_TOKENS, -} from "../plugin-sdk/provider-models.js"; diff --git a/src/agents/ollama-stream.test.ts b/src/agents/ollama-stream.test.ts index e8239797a31..196c7007a0a 100644 --- a/src/agents/ollama-stream.test.ts +++ b/src/agents/ollama-stream.test.ts @@ -6,7 +6,7 @@ import { buildAssistantMessage, parseNdjsonStream, resolveOllamaBaseUrlForRun, -} from "./ollama-stream.js"; +} from "../../extensions/ollama/src/stream.js"; describe("convertToOllamaMessages", () => { it("converts user text messages", () => { diff --git a/src/agents/ollama-stream.ts b/src/agents/ollama-stream.ts deleted file mode 100644 index d2d1d997c6b..00000000000 --- a/src/agents/ollama-stream.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { - buildAssistantMessage, - convertToOllamaMessages, - createConfiguredOllamaStreamFn, - createOllamaStreamFn, - OLLAMA_NATIVE_BASE_URL, - parseNdjsonStream, - resolveOllamaBaseUrlForRun, -} from "../plugin-sdk/ollama-stream.js"; diff --git a/src/agents/pi-embedded-runner/run/attempt.ollama-compat.ts b/src/agents/pi-embedded-runner/run/attempt.ollama-compat.ts deleted file mode 100644 index c19890babeb..00000000000 --- a/src/agents/pi-embedded-runner/run/attempt.ollama-compat.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { StreamFn } from "@mariozechner/pi-agent-core"; -import { streamSimple } from "@mariozechner/pi-ai"; -import type { OpenClawConfig } from "../../../config/config.js"; -import { normalizeProviderId } from "../../model-selection.js"; - -export function isOllamaCompatProvider(model: { - provider?: string; - baseUrl?: string; - api?: string; -}): boolean { - const providerId = normalizeProviderId(model.provider ?? ""); - if (providerId === "ollama") { - return true; - } - if (!model.baseUrl) { - return false; - } - try { - const parsed = new URL(model.baseUrl); - const hostname = parsed.hostname.toLowerCase(); - const isLocalhost = - hostname === "localhost" || - hostname === "127.0.0.1" || - hostname === "::1" || - hostname === "[::1]"; - if (isLocalhost && parsed.port === "11434") { - return true; - } - - // Allow remote/LAN Ollama OpenAI-compatible endpoints when the provider id - // itself indicates Ollama usage (e.g. "my-ollama"). - const providerHintsOllama = providerId.includes("ollama"); - const isOllamaPort = parsed.port === "11434"; - const isOllamaCompatPath = parsed.pathname === "/" || /^\/v1\/?$/i.test(parsed.pathname); - return providerHintsOllama && isOllamaPort && isOllamaCompatPath; - } catch { - return false; - } -} - -export function resolveOllamaCompatNumCtxEnabled(params: { - config?: OpenClawConfig; - providerId?: string; -}): boolean { - const providerId = params.providerId?.trim(); - if (!providerId) { - return true; - } - const providers = params.config?.models?.providers; - if (!providers) { - return true; - } - const direct = providers[providerId]; - if (direct) { - return direct.injectNumCtxForOpenAICompat ?? true; - } - const normalized = normalizeProviderId(providerId); - for (const [candidateId, candidate] of Object.entries(providers)) { - if (normalizeProviderId(candidateId) === normalized) { - return candidate.injectNumCtxForOpenAICompat ?? true; - } - } - return true; -} - -export function shouldInjectOllamaCompatNumCtx(params: { - model: { api?: string; provider?: string; baseUrl?: string }; - config?: OpenClawConfig; - providerId?: string; -}): boolean { - if (params.model.api !== "openai-completions") { - return false; - } - if (!isOllamaCompatProvider(params.model)) { - return false; - } - return resolveOllamaCompatNumCtxEnabled({ - config: params.config, - providerId: params.providerId, - }); -} - -export function wrapOllamaCompatNumCtx(baseFn: StreamFn | undefined, numCtx: number): StreamFn { - const streamFn = baseFn ?? streamSimple; - return (model, context, options) => - streamFn(model, context, { - ...options, - onPayload: (payload: unknown) => { - if (!payload || typeof payload !== "object") { - return options?.onPayload?.(payload, model); - } - const payloadRecord = payload as Record; - if (!payloadRecord.options || typeof payloadRecord.options !== "object") { - payloadRecord.options = {}; - } - (payloadRecord.options as Record).num_ctx = numCtx; - return options?.onPayload?.(payload, model); - }, - }); -} diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts index bdb8170025e..ac03c6e387a 100644 --- a/src/agents/pi-embedded-runner/run/attempt.ts +++ b/src/agents/pi-embedded-runner/run/attempt.ts @@ -7,6 +7,12 @@ import { DefaultResourceLoader, SessionManager, } from "@mariozechner/pi-coding-agent"; +import { + isOllamaCompatProvider, + resolveOllamaCompatNumCtxEnabled, + shouldInjectOllamaCompatNumCtx, + wrapOllamaCompatNumCtx, +} from "../../../../extensions/ollama/src/stream.js"; import { resolveTelegramInlineButtonsScope, resolveTelegramReactionLevel, @@ -131,7 +137,6 @@ import { finalizeAttemptContextEngineTurn, runAttemptContextEngineBootstrap, } from "./attempt.context-engine-helpers.js"; -import { shouldInjectOllamaCompatNumCtx, wrapOllamaCompatNumCtx } from "./attempt.ollama-compat.js"; import { buildAfterTurnRuntimeContext, prependSystemPromptAddition, @@ -197,7 +202,7 @@ export { resolveOllamaCompatNumCtxEnabled, shouldInjectOllamaCompatNumCtx, wrapOllamaCompatNumCtx, -} from "./attempt.ollama-compat.js"; +} from "../../../../extensions/ollama/src/stream.js"; export { decodeHtmlEntitiesInObject, wrapStreamFnRepairMalformedToolCallArguments, diff --git a/src/commands/ollama-setup.test.ts b/src/commands/ollama-setup.test.ts index 0f97dfbbd4b..e26872e213d 100644 --- a/src/commands/ollama-setup.test.ts +++ b/src/commands/ollama-setup.test.ts @@ -1,12 +1,12 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import type { RuntimeEnv } from "../runtime.js"; -import { jsonResponse, requestBodyText, requestUrl } from "../test-helpers/http.js"; -import type { WizardPrompter } from "../wizard/prompts.js"; import { configureOllamaNonInteractive, ensureOllamaModelPulled, promptAndConfigureOllama, -} from "./ollama-setup.js"; +} from "../../extensions/ollama/src/setup.js"; +import type { RuntimeEnv } from "../runtime.js"; +import { jsonResponse, requestBodyText, requestUrl } from "../test-helpers/http.js"; +import type { WizardPrompter } from "../wizard/prompts.js"; const upsertAuthProfileWithLock = vi.hoisted(() => vi.fn(async () => {})); vi.mock("../agents/auth-profiles.js", () => ({ diff --git a/src/commands/ollama-setup.ts b/src/commands/ollama-setup.ts deleted file mode 100644 index be718332978..00000000000 --- a/src/commands/ollama-setup.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { - buildOllamaProvider, - configureOllamaNonInteractive, - ensureOllamaModelPulled, - promptAndConfigureOllama, -} from "../plugin-sdk/provider-setup.js"; diff --git a/src/plugin-sdk/ollama-setup.ts b/src/plugin-sdk/ollama-setup.ts deleted file mode 100644 index b3956851f64..00000000000 --- a/src/plugin-sdk/ollama-setup.ts +++ /dev/null @@ -1,19 +0,0 @@ -export type { - OpenClawPluginApi, - ProviderAuthContext, - ProviderAuthMethodNonInteractiveContext, - ProviderAuthResult, - ProviderDiscoveryContext, -} from "../plugins/types.js"; - -export { - OLLAMA_DEFAULT_BASE_URL, - OLLAMA_DEFAULT_MODEL, -} from "../../extensions/ollama/src/defaults.js"; - -export { - buildOllamaProvider, - configureOllamaNonInteractive, - ensureOllamaModelPulled, - promptAndConfigureOllama, -} from "../../extensions/ollama/src/setup.js"; diff --git a/src/plugin-sdk/ollama-stream.ts b/src/plugin-sdk/ollama-stream.ts deleted file mode 100644 index f7db10b541d..00000000000 --- a/src/plugin-sdk/ollama-stream.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { - buildAssistantMessage, - convertToOllamaMessages, - createConfiguredOllamaStreamFn, - createOllamaStreamFn, - OLLAMA_NATIVE_BASE_URL, - parseNdjsonStream, - resolveOllamaBaseUrlForRun, -} from "../../extensions/ollama/src/stream.js"; diff --git a/src/plugin-sdk/subpaths.test.ts b/src/plugin-sdk/subpaths.test.ts index e7b28a694db..48e1ff194fa 100644 --- a/src/plugin-sdk/subpaths.test.ts +++ b/src/plugin-sdk/subpaths.test.ts @@ -549,7 +549,6 @@ describe("plugin-sdk subpath exports", () => { "buildSglangProvider", "configureOpenAICompatibleSelfHostedProviderNonInteractive", ]); - expectSourceMentions("ollama-setup", ["buildOllamaProvider", "configureOllamaNonInteractive"]); expectSourceMentions("sandbox", ["registerSandboxBackend", "runPluginCommandWithTimeout"]); expectSourceMentions("secret-input", [ diff --git a/src/plugins/contracts/discovery.contract.test.ts b/src/plugins/contracts/discovery.contract.test.ts index cf3b24115de..664efbe4ec4 100644 --- a/src/plugins/contracts/discovery.contract.test.ts +++ b/src/plugins/contracts/discovery.contract.test.ts @@ -142,14 +142,6 @@ describe("provider discovery contract", () => { buildSglangProvider: (...args: unknown[]) => buildSglangProviderMock(...args), }; }); - vi.doMock("openclaw/plugin-sdk/ollama-setup", async () => { - const actual = await vi.importActual("openclaw/plugin-sdk/ollama-setup"); - return { - ...actual, - buildOllamaProvider: (...args: unknown[]) => buildOllamaProviderMock(...args), - }; - }); - ({ runProviderCatalog } = await import("../provider-discovery.js")); const [ { default: githubCopilotPlugin }, diff --git a/src/plugins/provider-ollama-setup.ts b/src/plugins/provider-ollama-setup.ts deleted file mode 100644 index 38bfca3e741..00000000000 --- a/src/plugins/provider-ollama-setup.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - OLLAMA_DEFAULT_BASE_URL, - OLLAMA_DEFAULT_MODEL, - buildOllamaProvider, - configureOllamaNonInteractive, - ensureOllamaModelPulled, - promptAndConfigureOllama, -} from "../plugin-sdk/provider-setup.js";