mirror of
https://github.com/hanzoai/bot.git
synced 2026-11-01 18:02:28 +00:00
The automated rebrand sed script replaced "OpenClaw" with "Hanzo Bot" (with space) instead of "HanzoBot" in 8,315 TypeScript identifier occurrences across 1,632 files. This fixes all broken class names, type names, function names, and variable names. Co-authored-by: Hanzo Dev <[email protected]>
125 lines
4.1 KiB
TypeScript
125 lines
4.1 KiB
TypeScript
import {
|
|
definePluginEntry,
|
|
type HanzoBotPluginApi,
|
|
type ProviderAuthContext,
|
|
type ProviderAuthMethodNonInteractiveContext,
|
|
type ProviderAuthResult,
|
|
type ProviderDiscoveryContext,
|
|
} from "openclaw/plugin-sdk/core";
|
|
import { OLLAMA_DEFAULT_BASE_URL, resolveOllamaApiBase } from "openclaw/plugin-sdk/provider-models";
|
|
|
|
const PROVIDER_ID = "ollama";
|
|
const DEFAULT_API_KEY = "ollama-local";
|
|
|
|
async function loadProviderSetup() {
|
|
return await import("openclaw/plugin-sdk/ollama-setup");
|
|
}
|
|
|
|
export default definePluginEntry({
|
|
id: "ollama",
|
|
name: "Ollama Provider",
|
|
description: "Bundled Ollama provider plugin",
|
|
register(api: HanzoBotPluginApi) {
|
|
api.registerProvider({
|
|
id: PROVIDER_ID,
|
|
label: "Ollama",
|
|
docsPath: "/providers/ollama",
|
|
envVars: ["OLLAMA_API_KEY"],
|
|
auth: [
|
|
{
|
|
id: "local",
|
|
label: "Ollama",
|
|
hint: "Cloud and local open models",
|
|
kind: "custom",
|
|
run: async (ctx: ProviderAuthContext): Promise<ProviderAuthResult> => {
|
|
const providerSetup = await loadProviderSetup();
|
|
const result = await providerSetup.promptAndConfigureOllama({
|
|
cfg: ctx.config,
|
|
prompter: ctx.prompter,
|
|
});
|
|
return {
|
|
profiles: [
|
|
{
|
|
profileId: "ollama:default",
|
|
credential: {
|
|
type: "api_key",
|
|
provider: PROVIDER_ID,
|
|
key: DEFAULT_API_KEY,
|
|
},
|
|
},
|
|
],
|
|
configPatch: result.config,
|
|
};
|
|
},
|
|
runNonInteractive: async (ctx: ProviderAuthMethodNonInteractiveContext) => {
|
|
const providerSetup = await loadProviderSetup();
|
|
return await providerSetup.configureOllamaNonInteractive({
|
|
nextConfig: ctx.config,
|
|
opts: ctx.opts,
|
|
runtime: ctx.runtime,
|
|
});
|
|
},
|
|
},
|
|
],
|
|
discovery: {
|
|
order: "late",
|
|
run: async (ctx: ProviderDiscoveryContext) => {
|
|
const explicit = ctx.config.models?.providers?.ollama;
|
|
const hasExplicitModels = Array.isArray(explicit?.models) && explicit.models.length > 0;
|
|
const ollamaKey = ctx.resolveProviderApiKey(PROVIDER_ID).apiKey;
|
|
if (hasExplicitModels && explicit) {
|
|
return {
|
|
provider: {
|
|
...explicit,
|
|
baseUrl:
|
|
typeof explicit.baseUrl === "string" && explicit.baseUrl.trim()
|
|
? resolveOllamaApiBase(explicit.baseUrl)
|
|
: OLLAMA_DEFAULT_BASE_URL,
|
|
api: explicit.api ?? "ollama",
|
|
apiKey: ollamaKey ?? explicit.apiKey ?? DEFAULT_API_KEY,
|
|
},
|
|
};
|
|
}
|
|
|
|
const providerSetup = await loadProviderSetup();
|
|
const provider = await providerSetup.buildOllamaProvider(explicit?.baseUrl, {
|
|
quiet: !ollamaKey && !explicit,
|
|
});
|
|
if (provider.models.length === 0 && !ollamaKey && !explicit?.apiKey) {
|
|
return null;
|
|
}
|
|
return {
|
|
provider: {
|
|
...provider,
|
|
apiKey: ollamaKey ?? explicit?.apiKey ?? DEFAULT_API_KEY,
|
|
},
|
|
};
|
|
},
|
|
},
|
|
wizard: {
|
|
setup: {
|
|
choiceId: "ollama",
|
|
choiceLabel: "Ollama",
|
|
choiceHint: "Cloud and local open models",
|
|
groupId: "ollama",
|
|
groupLabel: "Ollama",
|
|
groupHint: "Cloud and local open models",
|
|
methodId: "local",
|
|
},
|
|
modelPicker: {
|
|
label: "Ollama (custom)",
|
|
hint: "Detect models from a local or remote Ollama instance",
|
|
methodId: "local",
|
|
},
|
|
},
|
|
onModelSelected: async ({ config, model, prompter }) => {
|
|
if (!model.startsWith("ollama/")) {
|
|
return;
|
|
}
|
|
const providerSetup = await loadProviderSetup();
|
|
await providerSetup.ensureOllamaModelPulled({ config, model, prompter });
|
|
},
|
|
});
|
|
},
|
|
});
|