@elizaos/plugin-ollama 1.2.4 → 2.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/LICENSE +1 -1
  2. package/dist/browser/index.browser.js +424 -0
  3. package/dist/browser/index.browser.js.map +15 -0
  4. package/dist/browser/index.d.ts +2 -0
  5. package/dist/cjs/index.d.ts +2 -0
  6. package/dist/cjs/index.node.cjs +456 -0
  7. package/dist/cjs/index.node.cjs.map +15 -0
  8. package/dist/node/build.d.ts +2 -0
  9. package/dist/node/build.d.ts.map +1 -0
  10. package/dist/node/generated/specs/specs.d.ts +55 -0
  11. package/dist/node/generated/specs/specs.d.ts.map +1 -0
  12. package/dist/node/index.browser.d.ts +3 -0
  13. package/dist/node/index.browser.d.ts.map +1 -0
  14. package/dist/node/index.d.ts +2 -0
  15. package/dist/node/index.d.ts.map +1 -0
  16. package/dist/node/index.node.js +424 -0
  17. package/dist/node/index.node.js.map +15 -0
  18. package/dist/node/models/availability.d.ts +2 -0
  19. package/dist/node/models/availability.d.ts.map +1 -0
  20. package/dist/node/models/embedding.d.ts +3 -0
  21. package/dist/node/models/embedding.d.ts.map +1 -0
  22. package/dist/node/models/index.d.ts +5 -0
  23. package/dist/node/models/index.d.ts.map +1 -0
  24. package/dist/node/models/object.d.ts +4 -0
  25. package/dist/node/models/object.d.ts.map +1 -0
  26. package/dist/node/models/text.d.ts +4 -0
  27. package/dist/node/models/text.d.ts.map +1 -0
  28. package/dist/node/plugin.d.ts +3 -0
  29. package/dist/node/plugin.d.ts.map +1 -0
  30. package/dist/node/types/index.d.ts +47 -0
  31. package/dist/node/types/index.d.ts.map +1 -0
  32. package/dist/node/utils/config.d.ts +15 -0
  33. package/dist/node/utils/config.d.ts.map +1 -0
  34. package/dist/node/utils/index.d.ts +2 -0
  35. package/dist/node/utils/index.d.ts.map +1 -0
  36. package/package.json +41 -24
  37. package/README.md +0 -160
  38. package/dist/index.js +0 -356
  39. package/dist/index.js.map +0 -1
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-ollama",
3
- "version": "1.2.4",
3
+ "version": "2.0.0-alpha.2",
4
4
  "type": "module",
5
- "main": "dist/index.js",
6
- "module": "dist/index.js",
7
- "types": "dist/index.d.ts",
5
+ "main": "dist/node/index.node.js",
6
+ "module": "dist/node/index.node.js",
7
+ "types": "dist/node/index.d.ts",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "git+https://github.com/elizaos-plugins/plugin-ollama.git"
@@ -12,32 +12,54 @@
12
12
  "exports": {
13
13
  "./package.json": "./package.json",
14
14
  ".": {
15
- "import": {
16
- "types": "./dist/index.d.ts",
17
- "default": "./dist/index.js"
18
- }
15
+ "types": "./dist/node/index.d.ts",
16
+ "browser": {
17
+ "types": "./dist/browser/index.d.ts",
18
+ "import": "./dist/browser/index.browser.js",
19
+ "default": "./dist/browser/index.browser.js"
20
+ },
21
+ "node": {
22
+ "types": "./dist/node/index.d.ts",
23
+ "import": "./dist/node/index.node.js",
24
+ "default": "./dist/node/index.node.js"
25
+ },
26
+ "bun": {
27
+ "types": "./dist/node/index.d.ts",
28
+ "default": "./dist/node/index.node.js"
29
+ },
30
+ "require": "./dist/cjs/index.node.cjs",
31
+ "default": "./dist/node/index.node.js"
19
32
  }
20
33
  },
21
34
  "files": [
22
35
  "dist"
23
36
  ],
37
+ "sideEffects": false,
24
38
  "dependencies": {
25
39
  "@ai-sdk/ui-utils": "^1.2.8",
26
- "@elizaos/core": "^1.0.0",
40
+ "@elizaos/core": "2.0.0-alpha.2",
27
41
  "ai": "^4.3.9",
28
42
  "js-tiktoken": "^1.0.18",
29
- "ollama-ai-provider": "^1.2.0",
30
- "tsup": "8.4.0"
43
+ "ollama-ai-provider": "^1.2.0"
44
+ },
45
+ "devDependencies": {
46
+ "@biomejs/biome": "^2.3.11",
47
+ "@types/node": "^25.0.3",
48
+ "typescript": "^5.9.3"
31
49
  },
32
50
  "scripts": {
33
- "build": "tsup",
34
- "dev": "tsup --watch",
35
- "lint": "prettier --write ./src",
51
+ "dev": "bun run build.ts --watch",
52
+ "lint": "bunx @biomejs/biome check --write --unsafe .",
36
53
  "clean": "rm -rf dist .turbo node_modules .turbo-tsconfig.json tsconfig.tsbuildinfo",
37
- "format": "prettier --write ./src",
38
- "format:check": "prettier --check ./src",
39
- "test": "bun test",
40
- "postinstall": "bun scripts/install-ollama.js"
54
+ "format": "bunx @biomejs/biome format --write .",
55
+ "format:check": "bunx @biomejs/biome format .",
56
+ "typecheck": "tsc --noEmit -p tsconfig.json",
57
+ "test": "vitest run",
58
+ "test:unit": "vitest run __tests__/",
59
+ "postinstall": "bun scripts/install-ollama.js",
60
+ "lint:check": "bunx @biomejs/biome check .",
61
+ "build": "bun run build.ts",
62
+ "build:ts": "bun run build.ts"
41
63
  },
42
64
  "publishConfig": {
43
65
  "access": "public"
@@ -95,10 +117,5 @@
95
117
  }
96
118
  }
97
119
  },
98
- "gitHead": "646c632924826e2b75c2304a75ee56959fe4a460",
99
- "devDependencies": {
100
- "@types/node": "^24.0.4",
101
- "prettier": "3.5.3",
102
- "typescript": "^5.8.2"
103
- }
120
+ "gitHead": "bc6cac8d36845d7cbde51a64307c6a57c16378ad"
104
121
  }
package/README.md DELETED
@@ -1,160 +0,0 @@
1
- # Ollama Plugin
2
-
3
- This plugin provides integration with [Ollama](https://ollama.com/)'s local models through the ElizaOS platform. It allows you to leverage locally running LLMs for text generation, embeddings, and object generation.
4
-
5
- ## Overview
6
-
7
- Ollama enables running large language models locally on your machine. This plugin connects ElizaOS with your local Ollama installation, giving your characters access to powerful language models running on your own hardware.
8
-
9
- ## Requirements
10
-
11
- - [Ollama](https://ollama.com/) installed and running on your system
12
- - ElizaOS platform
13
- - At least one Ollama model pulled and available (e.g., `llama3`, `gemma3:latest`)
14
-
15
- ## Installation
16
-
17
- 1. Install this plugin in your ElizaOS project:
18
- ```bash
19
- bun add @elizaos-plugins/plugin-ollama
20
- ```
21
-
22
- 2. Make sure Ollama is running:
23
- ```bash
24
- ollama serve
25
- ```
26
-
27
- ## Usage
28
-
29
- Add the plugin to your character configuration:
30
-
31
- ```json
32
- "plugins": ["@elizaos-plugins/plugin-ollama"]
33
- ```
34
-
35
- ## Configuration
36
-
37
- The plugin requires these environment variables (can be set in .env file or character settings):
38
-
39
- ```json
40
- "settings": {
41
- "OLLAMA_API_ENDPOINT": "http://localhost:11434/api",
42
- "OLLAMA_SMALL_MODEL": "gemma3:latest",
43
- "OLLAMA_MEDIUM_MODEL": "gemma3:latest",
44
- "OLLAMA_LARGE_MODEL": "gemma3:latest",
45
- "OLLAMA_EMBEDDING_MODEL": "nomic-embed-text:latest"
46
- }
47
- ```
48
-
49
- Or in `.env` file:
50
-
51
- ```
52
- OLLAMA_API_ENDPOINT=http://localhost:11434/api
53
- OLLAMA_SMALL_MODEL=gemma3:latest
54
- OLLAMA_MEDIUM_MODEL=gemma3:latest
55
- OLLAMA_LARGE_MODEL=gemma3:latest
56
- OLLAMA_EMBEDDING_MODEL=nomic-embed-text:latest
57
- ```
58
-
59
- ### Configuration Options
60
-
61
- - `OLLAMA_API_ENDPOINT`: Ollama API endpoint (default: http://localhost:11434/api)
62
- - `OLLAMA_SMALL_MODEL`: Model for simpler tasks (default: gemma3:latest)
63
- - `OLLAMA_MEDIUM_MODEL`: Medium-complexity model (default: gemma3:latest)
64
- - `OLLAMA_LARGE_MODEL`: Model for complex tasks (default: gemma3:latest)
65
- - `OLLAMA_EMBEDDING_MODEL`: Model for text embeddings (default: nomic-embed-text:latest)
66
-
67
- The plugin provides these model classes:
68
-
69
- - `TEXT_SMALL`: Optimized for fast responses with simpler prompts
70
- - `TEXT_LARGE`: For complex tasks requiring deeper reasoning
71
- - `TEXT_EMBEDDING`: Text embedding model
72
- - `OBJECT_SMALL`: JSON object generation with simpler models
73
- - `OBJECT_LARGE`: JSON object generation with more complex models
74
-
75
- ## API Reference
76
-
77
- For detailed information about the Ollama API used by this plugin, refer to the [official Ollama API documentation](https://github.com/ollama/ollama/blob/main/docs/api.md).
78
-
79
-
80
-
81
- ## Features
82
-
83
- ### Text Generation (Small Model)
84
-
85
- Generate text using smaller, faster models optimized for quick responses:
86
-
87
- ```js
88
- const text = await runtime.useModel(ModelType.TEXT_SMALL, {
89
- prompt: 'What is the nature of reality?',
90
- stopSequences: [], // optional
91
- });
92
- ```
93
-
94
- ### Text Generation (Large Model)
95
-
96
- Generate comprehensive text responses using more powerful models for complex tasks:
97
-
98
- ```js
99
- const text = await runtime.useModel(ModelType.TEXT_LARGE, {
100
- prompt: 'Write a detailed explanation of quantum physics',
101
- stopSequences: [], // optional
102
- maxTokens: 8192, // optional (default: 8192)
103
- temperature: 0.7, // optional (default: 0.7)
104
- frequencyPenalty: 0.7, // optional (default: 0.7)
105
- presencePenalty: 0.7, // optional (default: 0.7)
106
- });
107
- ```
108
-
109
- ### Text Embeddings
110
-
111
- Generate vector embeddings for text, which can be used for semantic search or other vector operations:
112
-
113
- ```js
114
- const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {
115
- text: 'Text to embed',
116
- });
117
- // or
118
- const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, 'Text to embed');
119
- ```
120
-
121
- ### Object Generation (Small Model)
122
-
123
- Generate structured JSON objects using faster models:
124
-
125
- ```js
126
- const object = await runtime.useModel(ModelType.OBJECT_SMALL, {
127
- prompt: 'Generate a JSON object representing a user profile',
128
- temperature: 0.7, // optional
129
- });
130
- ```
131
-
132
- ### Object Generation (Large Model)
133
-
134
- Generate complex, detailed JSON objects using more powerful models:
135
-
136
- ```js
137
- const object = await runtime.useModel(ModelType.OBJECT_LARGE, {
138
- prompt: 'Generate a detailed JSON object representing a restaurant',
139
- temperature: 0.7, // optional
140
- });
141
- ```
142
-
143
- ## Troubleshooting
144
-
145
- ### Connection Issues
146
-
147
- - Ensure Ollama is running by testing the `OLLAMA_API_ENDPOINT`
148
- - Verify the `OLLAMA_API_ENDPOINT` points to the correct host and port
149
- - Check firewall settings if connecting to a remote Ollama instance
150
-
151
- ### Model Availability
152
-
153
- - The plugin will attempt to download models automatically if they're not found
154
- - You can pre-download models using `ollama pull modelname`
155
- - Check model availability with `ollama list`
156
-
157
-
158
- ## License
159
-
160
- See LICENSE file for details.
package/dist/index.js DELETED
@@ -1,356 +0,0 @@
1
- // src/index.ts
2
- import { ModelType, logger } from "@elizaos/core";
3
- import { generateObject, generateText, embed } from "ai";
4
- import { createOllama } from "ollama-ai-provider";
5
- var OLLAMA_API_URL = "http://localhost:11434/api";
6
- function getBaseURL(runtime) {
7
- const apiEndpoint = runtime.getSetting("OLLAMA_API_ENDPOINT") || runtime.getSetting("OLLAMA_API_URL") || OLLAMA_API_URL;
8
- if (!apiEndpoint.endsWith("/api")) {
9
- return apiEndpoint.endsWith("/") ? `${apiEndpoint}api` : `${apiEndpoint}/api`;
10
- }
11
- return apiEndpoint;
12
- }
13
- async function ensureModelAvailable(runtime, model, providedBaseURL) {
14
- const baseURL = providedBaseURL || getBaseURL(runtime);
15
- const apiBase = baseURL.endsWith("/api") ? baseURL.slice(0, -4) : baseURL;
16
- try {
17
- const showRes = await fetch(`${apiBase}/api/show`, {
18
- method: "POST",
19
- headers: { "Content-Type": "application/json" },
20
- body: JSON.stringify({ model })
21
- });
22
- if (showRes.ok) return;
23
- logger.info(`[Ollama] Model ${model} not found locally. Downloading...`);
24
- const pullRes = await fetch(`${apiBase}/api/pull`, {
25
- method: "POST",
26
- headers: { "Content-Type": "application/json" },
27
- body: JSON.stringify({ model, stream: false })
28
- });
29
- if (!pullRes.ok) {
30
- logger.error(`Failed to pull model ${model}: ${pullRes.statusText}`);
31
- } else {
32
- logger.info(`[Ollama] Downloaded model ${model}`);
33
- }
34
- } catch (err) {
35
- logger.error({ error: err }, "Error ensuring model availability");
36
- }
37
- }
38
- async function generateOllamaText(ollama, model, params) {
39
- try {
40
- const { text: ollamaResponse } = await generateText({
41
- model: ollama(model),
42
- prompt: params.prompt,
43
- system: params.system,
44
- temperature: params.temperature,
45
- maxTokens: params.maxTokens,
46
- frequencyPenalty: params.frequencyPenalty,
47
- presencePenalty: params.presencePenalty,
48
- stopSequences: params.stopSequences
49
- });
50
- return ollamaResponse;
51
- } catch (error) {
52
- logger.error({ error }, "Error in generateOllamaText");
53
- return "Error generating text. Please try again later.";
54
- }
55
- }
56
- async function generateOllamaObject(ollama, model, params) {
57
- try {
58
- const { object } = await generateObject({
59
- model: ollama(model),
60
- output: "no-schema",
61
- prompt: params.prompt,
62
- temperature: params.temperature
63
- });
64
- return object;
65
- } catch (error) {
66
- logger.error({ error }, "Error generating object");
67
- return {};
68
- }
69
- }
70
- var ollamaPlugin = {
71
- name: "ollama",
72
- description: "Ollama plugin",
73
- config: {
74
- OLLAMA_API_ENDPOINT: process.env.OLLAMA_API_ENDPOINT,
75
- OLLAMA_SMALL_MODEL: process.env.OLLAMA_SMALL_MODEL,
76
- OLLAMA_MEDIUM_MODEL: process.env.OLLAMA_MEDIUM_MODEL,
77
- OLLAMA_LARGE_MODEL: process.env.OLLAMA_LARGE_MODEL,
78
- OLLAMA_EMBEDDING_MODEL: process.env.OLLAMA_EMBEDDING_MODEL
79
- },
80
- async init(_config, runtime) {
81
- const baseURL = getBaseURL(runtime);
82
- if (!baseURL || baseURL === "http://localhost:11434/api") {
83
- const endpoint = runtime.getSetting("OLLAMA_API_ENDPOINT");
84
- if (!endpoint) {
85
- logger.warn(
86
- "OLLAMA_API_ENDPOINT is not set in environment - Ollama functionality will use default localhost:11434"
87
- );
88
- }
89
- }
90
- try {
91
- const apiBase = baseURL.endsWith("/api") ? baseURL.slice(0, -4) : baseURL;
92
- const response = await fetch(`${apiBase}/api/tags`, {
93
- method: "GET",
94
- headers: { "Content-Type": "application/json" }
95
- });
96
- if (!response.ok) {
97
- logger.warn(`Ollama API endpoint validation failed: ${response.statusText}`);
98
- logger.warn("Ollama functionality will be limited until a valid endpoint is provided");
99
- } else {
100
- const data = await response.json();
101
- const modelCount = data?.models?.length || 0;
102
- logger.log(
103
- `Ollama API endpoint validated successfully. Found ${modelCount} models available.`
104
- );
105
- }
106
- } catch (fetchError) {
107
- const message = fetchError instanceof Error ? fetchError.message : String(fetchError);
108
- logger.warn(`Error validating Ollama API endpoint: ${message}`);
109
- logger.warn(
110
- "Ollama functionality will be limited until a valid endpoint is provided - Make sure Ollama is running at ${baseURL}"
111
- );
112
- }
113
- },
114
- models: {
115
- [ModelType.TEXT_EMBEDDING]: async (runtime, params) => {
116
- try {
117
- const baseURL = getBaseURL(runtime);
118
- const ollama = createOllama({
119
- fetch: runtime.fetch,
120
- baseURL
121
- });
122
- const modelName = runtime.getSetting("OLLAMA_EMBEDDING_MODEL") || "nomic-embed-text:latest";
123
- logger.log(`[Ollama] Using TEXT_EMBEDDING model: ${modelName}`);
124
- await ensureModelAvailable(runtime, modelName, baseURL);
125
- const text = typeof params === "string" ? params : params ? params.text || "" : "";
126
- const embeddingText = text || "test";
127
- if (!text) {
128
- logger.debug(
129
- "No text provided for embedding, using default text for dimension detection"
130
- );
131
- }
132
- try {
133
- const { embedding } = await embed({
134
- model: ollama.embedding(modelName),
135
- value: embeddingText
136
- });
137
- return embedding;
138
- } catch (embeddingError) {
139
- logger.error({ error: embeddingError }, "Error generating embedding");
140
- return Array(1536).fill(0);
141
- }
142
- } catch (error) {
143
- logger.error({ error }, "Error in TEXT_EMBEDDING model");
144
- return Array(1536).fill(0);
145
- }
146
- },
147
- [ModelType.TEXT_SMALL]: async (runtime, { prompt, stopSequences = [] }) => {
148
- try {
149
- const temperature = 0.7;
150
- const frequency_penalty = 0.7;
151
- const presence_penalty = 0.7;
152
- const max_response_length = 8e3;
153
- const baseURL = getBaseURL(runtime);
154
- const ollama = createOllama({
155
- fetch: runtime.fetch,
156
- baseURL
157
- });
158
- const model = runtime.getSetting("OLLAMA_SMALL_MODEL") || runtime.getSetting("SMALL_MODEL") || "gemma3:latest";
159
- logger.log(`[Ollama] Using TEXT_SMALL model: ${model}`);
160
- await ensureModelAvailable(runtime, model, baseURL);
161
- logger.log("generating text");
162
- logger.log(prompt);
163
- return await generateOllamaText(ollama, model, {
164
- prompt,
165
- system: runtime.character?.system || void 0,
166
- temperature,
167
- maxTokens: max_response_length,
168
- frequencyPenalty: frequency_penalty,
169
- presencePenalty: presence_penalty,
170
- stopSequences
171
- });
172
- } catch (error) {
173
- logger.error({ error }, "Error in TEXT_SMALL model");
174
- return "Error generating text. Please try again later.";
175
- }
176
- },
177
- [ModelType.TEXT_LARGE]: async (runtime, {
178
- prompt,
179
- stopSequences = [],
180
- maxTokens = 8192,
181
- temperature = 0.7,
182
- frequencyPenalty = 0.7,
183
- presencePenalty = 0.7
184
- }) => {
185
- try {
186
- const model = runtime.getSetting("OLLAMA_LARGE_MODEL") || runtime.getSetting("LARGE_MODEL") || "gemma3:latest";
187
- const baseURL = getBaseURL(runtime);
188
- const ollama = createOllama({
189
- fetch: runtime.fetch,
190
- baseURL
191
- });
192
- logger.log(`[Ollama] Using TEXT_LARGE model: ${model}`);
193
- await ensureModelAvailable(runtime, model, baseURL);
194
- return await generateOllamaText(ollama, model, {
195
- prompt,
196
- system: runtime.character?.system || void 0,
197
- temperature,
198
- maxTokens,
199
- frequencyPenalty,
200
- presencePenalty,
201
- stopSequences
202
- });
203
- } catch (error) {
204
- logger.error({ error }, "Error in TEXT_LARGE model");
205
- return "Error generating text. Please try again later.";
206
- }
207
- },
208
- [ModelType.OBJECT_SMALL]: async (runtime, params) => {
209
- try {
210
- const baseURL = getBaseURL(runtime);
211
- const ollama = createOllama({
212
- fetch: runtime.fetch,
213
- baseURL
214
- });
215
- const model = runtime.getSetting("OLLAMA_SMALL_MODEL") || runtime.getSetting("SMALL_MODEL") || "gemma3:latest";
216
- logger.log(`[Ollama] Using OBJECT_SMALL model: ${model}`);
217
- await ensureModelAvailable(runtime, model, baseURL);
218
- if (params.schema) {
219
- logger.info("Using OBJECT_SMALL without schema validation");
220
- }
221
- return await generateOllamaObject(ollama, model, params);
222
- } catch (error) {
223
- logger.error({ error }, "Error in OBJECT_SMALL model");
224
- return {};
225
- }
226
- },
227
- [ModelType.OBJECT_LARGE]: async (runtime, params) => {
228
- try {
229
- const baseURL = getBaseURL(runtime);
230
- const ollama = createOllama({
231
- fetch: runtime.fetch,
232
- baseURL
233
- });
234
- const model = runtime.getSetting("OLLAMA_LARGE_MODEL") || runtime.getSetting("LARGE_MODEL") || "gemma3:latest";
235
- logger.log(`[Ollama] Using OBJECT_LARGE model: ${model}`);
236
- await ensureModelAvailable(runtime, model, baseURL);
237
- if (params.schema) {
238
- logger.info("Using OBJECT_LARGE without schema validation");
239
- }
240
- return await generateOllamaObject(ollama, model, params);
241
- } catch (error) {
242
- logger.error({ error }, "Error in OBJECT_LARGE model");
243
- return {};
244
- }
245
- }
246
- },
247
- tests: [
248
- {
249
- name: "ollama_plugin_tests",
250
- tests: [
251
- {
252
- name: "ollama_test_url_validation",
253
- fn: async (runtime) => {
254
- try {
255
- const baseURL = getBaseURL(runtime);
256
- const apiBase = baseURL.endsWith("/api") ? baseURL.slice(0, -4) : baseURL;
257
- const response = await fetch(`${apiBase}/api/tags`);
258
- const data = await response.json();
259
- const modelCount = data && typeof data === "object" && "models" in data && Array.isArray(data.models) ? data.models.length : 0;
260
- logger.log(`Models Available: ${modelCount}`);
261
- if (!response.ok) {
262
- logger.error(`Failed to validate Ollama API: ${response.statusText}`);
263
- return;
264
- }
265
- } catch (error) {
266
- logger.error({ error }, "Error in ollama_test_url_validation");
267
- }
268
- }
269
- },
270
- {
271
- name: "ollama_test_text_embedding",
272
- fn: async (runtime) => {
273
- try {
274
- const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {
275
- text: "Hello, world!"
276
- });
277
- logger.log({ embedding }, "Generated embedding");
278
- } catch (error) {
279
- logger.error({ error }, "Error in test_text_embedding");
280
- }
281
- }
282
- },
283
- {
284
- name: "ollama_test_text_large",
285
- fn: async (runtime) => {
286
- try {
287
- const text = await runtime.useModel(ModelType.TEXT_LARGE, {
288
- prompt: "What is the nature of reality in 10 words?"
289
- });
290
- if (text.length === 0) {
291
- logger.error("Failed to generate text");
292
- return;
293
- }
294
- logger.log({ text }, "Generated with test_text_large");
295
- } catch (error) {
296
- logger.error({ error }, "Error in test_text_large");
297
- }
298
- }
299
- },
300
- {
301
- name: "ollama_test_text_small",
302
- fn: async (runtime) => {
303
- try {
304
- const text = await runtime.useModel(ModelType.TEXT_SMALL, {
305
- prompt: "What is the nature of reality in 10 words?"
306
- });
307
- if (text.length === 0) {
308
- logger.error("Failed to generate text");
309
- return;
310
- }
311
- logger.log({ text }, "Generated with test_text_small");
312
- } catch (error) {
313
- logger.error({ error }, "Error in test_text_small");
314
- }
315
- }
316
- },
317
- {
318
- name: "ollama_test_object_small",
319
- fn: async (runtime) => {
320
- try {
321
- const object = await runtime.useModel(ModelType.OBJECT_SMALL, {
322
- prompt: "Generate a JSON object representing a user profile with name, age, and hobbies",
323
- temperature: 0.7,
324
- schema: void 0
325
- });
326
- logger.log({ object }, "Generated object");
327
- } catch (error) {
328
- logger.error({ error }, "Error in test_object_small");
329
- }
330
- }
331
- },
332
- {
333
- name: "ollama_test_object_large",
334
- fn: async (runtime) => {
335
- try {
336
- const object = await runtime.useModel(ModelType.OBJECT_LARGE, {
337
- prompt: "Generate a detailed JSON object representing a restaurant with name, cuisine type, menu items with prices, and customer reviews",
338
- temperature: 0.7,
339
- schema: void 0
340
- });
341
- logger.log({ object }, "Generated object");
342
- } catch (error) {
343
- logger.error({ error }, "Error in test_object_large");
344
- }
345
- }
346
- }
347
- ]
348
- }
349
- ]
350
- };
351
- var index_default = ollamaPlugin;
352
- export {
353
- index_default as default,
354
- ollamaPlugin
355
- };
356
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { ObjectGenerationParams, Plugin, TextEmbeddingParams } from '@elizaos/core';\nimport { type GenerateTextParams, ModelType, logger } from '@elizaos/core';\nimport { generateObject, generateText, embed } from 'ai';\nimport { createOllama } from 'ollama-ai-provider';\n\n// Default Ollama API URL\nconst OLLAMA_API_URL = 'http://localhost:11434/api';\n\n/**\n * Retrieves the Ollama API base URL from runtime settings.\n *\n * If the API endpoint is not set in the runtime, defaults to the standard Ollama URL.\n * The URL should include the /api path for ollama-ai-provider compatibility.\n *\n * @returns The base URL for the Ollama API.\n */\nfunction getBaseURL(runtime: { getSetting: (key: string) => string | undefined }): string {\n const apiEndpoint =\n runtime.getSetting('OLLAMA_API_ENDPOINT') ||\n runtime.getSetting('OLLAMA_API_URL') ||\n OLLAMA_API_URL;\n\n // Ensure the URL ends with /api for ollama-ai-provider\n if (!apiEndpoint.endsWith('/api')) {\n return apiEndpoint.endsWith('/') ? `${apiEndpoint}api` : `${apiEndpoint}/api`;\n }\n return apiEndpoint;\n}\n\n/**\n * Ensures that the specified Ollama model is available locally, downloading it if necessary.\n *\n * Checks for the presence of the model via the Ollama API and attempts to download it if not found. Logs progress and errors during the process.\n */\nasync function ensureModelAvailable(\n runtime: {\n getSetting: (key: string) => string | undefined;\n fetch?: typeof fetch;\n },\n model: string,\n providedBaseURL?: string\n) {\n const baseURL = providedBaseURL || getBaseURL(runtime);\n // Remove /api suffix for direct API calls\n const apiBase = baseURL.endsWith('/api') ? baseURL.slice(0, -4) : baseURL;\n try {\n const showRes = await fetch(`${apiBase}/api/show`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model }),\n });\n if (showRes.ok) return;\n logger.info(`[Ollama] Model ${model} not found locally. Downloading...`);\n const pullRes = await fetch(`${apiBase}/api/pull`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model, stream: false }),\n });\n if (!pullRes.ok) {\n logger.error(`Failed to pull model ${model}: ${pullRes.statusText}`);\n } else {\n logger.info(`[Ollama] Downloaded model ${model}`);\n }\n } catch (err) {\n logger.error({ error: err }, 'Error ensuring model availability');\n }\n}\n\n/**\n * Generates text from the Ollama API using the specified model and parameters.\n *\n * Returns the generated text, or an error message if generation fails.\n */\nasync function generateOllamaText(\n ollama: ReturnType<typeof createOllama>,\n model: string,\n params: {\n prompt: string;\n system?: string;\n temperature: number;\n maxTokens: number;\n frequencyPenalty: number;\n presencePenalty: number;\n stopSequences: string[];\n }\n) {\n try {\n const { text: ollamaResponse } = await generateText({\n model: ollama(model),\n prompt: params.prompt,\n system: params.system,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n frequencyPenalty: params.frequencyPenalty,\n presencePenalty: params.presencePenalty,\n stopSequences: params.stopSequences,\n });\n return ollamaResponse;\n } catch (error: unknown) {\n logger.error({ error }, 'Error in generateOllamaText');\n return 'Error generating text. Please try again later.';\n }\n}\n\n/**\n * Generates an object from the Ollama API using the specified model and parameters.\n *\n * Returns the generated object, or an empty object if generation fails.\n */\nasync function generateOllamaObject(\n ollama: ReturnType<typeof createOllama>,\n model: string,\n params: ObjectGenerationParams\n) {\n try {\n const { object } = await generateObject({\n model: ollama(model),\n output: 'no-schema',\n prompt: params.prompt,\n temperature: params.temperature,\n });\n return object;\n } catch (error: unknown) {\n logger.error({ error }, 'Error generating object');\n return {};\n }\n}\n\nexport const ollamaPlugin: Plugin = {\n name: 'ollama',\n description: 'Ollama plugin',\n config: {\n OLLAMA_API_ENDPOINT: process.env.OLLAMA_API_ENDPOINT,\n OLLAMA_SMALL_MODEL: process.env.OLLAMA_SMALL_MODEL,\n OLLAMA_MEDIUM_MODEL: process.env.OLLAMA_MEDIUM_MODEL,\n OLLAMA_LARGE_MODEL: process.env.OLLAMA_LARGE_MODEL,\n OLLAMA_EMBEDDING_MODEL: process.env.OLLAMA_EMBEDDING_MODEL,\n },\n async init(_config, runtime) {\n const baseURL = getBaseURL(runtime);\n\n // Check if endpoint is configured\n if (!baseURL || baseURL === 'http://localhost:11434/api') {\n const endpoint = runtime.getSetting('OLLAMA_API_ENDPOINT');\n if (!endpoint) {\n logger.warn(\n 'OLLAMA_API_ENDPOINT is not set in environment - Ollama functionality will use default localhost:11434'\n );\n }\n }\n\n try {\n // Validate Ollama API endpoint by checking if it's accessible\n // Remove /api suffix for direct API calls\n const apiBase = baseURL.endsWith('/api') ? baseURL.slice(0, -4) : baseURL;\n const response = await fetch(`${apiBase}/api/tags`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n logger.warn(`Ollama API endpoint validation failed: ${response.statusText}`);\n logger.warn('Ollama functionality will be limited until a valid endpoint is provided');\n } else {\n const data = (await response.json()) as {\n models?: Array<{ name: string }>;\n };\n const modelCount = data?.models?.length || 0;\n logger.log(\n `Ollama API endpoint validated successfully. Found ${modelCount} models available.`\n );\n }\n } catch (fetchError: unknown) {\n const message = fetchError instanceof Error ? fetchError.message : String(fetchError);\n logger.warn(`Error validating Ollama API endpoint: ${message}`);\n logger.warn(\n 'Ollama functionality will be limited until a valid endpoint is provided - Make sure Ollama is running at ${baseURL}'\n );\n }\n },\n models: {\n [ModelType.TEXT_EMBEDDING]: async (\n runtime,\n params: TextEmbeddingParams | string | null\n ): Promise<number[]> => {\n try {\n const baseURL = getBaseURL(runtime);\n const ollama = createOllama({\n fetch: runtime.fetch,\n baseURL,\n });\n\n const modelName = runtime.getSetting('OLLAMA_EMBEDDING_MODEL') || 'nomic-embed-text:latest';\n logger.log(`[Ollama] Using TEXT_EMBEDDING model: ${modelName}`);\n await ensureModelAvailable(runtime, modelName, baseURL);\n const text =\n typeof params === 'string'\n ? params\n : params\n ? (params as TextEmbeddingParams).text || ''\n : '';\n\n // If no text is provided (e.g., for dimension detection), use a default text\n const embeddingText = text || 'test';\n\n if (!text) {\n logger.debug(\n 'No text provided for embedding, using default text for dimension detection'\n );\n }\n\n // Use ollama.embedding() as shown in the docs\n try {\n const { embedding } = await embed({\n model: ollama.embedding(modelName),\n value: embeddingText,\n });\n return embedding;\n } catch (embeddingError) {\n logger.error({ error: embeddingError }, 'Error generating embedding');\n return Array(1536).fill(0);\n }\n } catch (error) {\n logger.error({ error }, 'Error in TEXT_EMBEDDING model');\n // Return a fallback vector rather than crashing\n return Array(1536).fill(0);\n }\n },\n [ModelType.TEXT_SMALL]: async (runtime, { prompt, stopSequences = [] }: GenerateTextParams) => {\n try {\n const temperature = 0.7;\n const frequency_penalty = 0.7;\n const presence_penalty = 0.7;\n const max_response_length = 8000;\n const baseURL = getBaseURL(runtime);\n const ollama = createOllama({\n fetch: runtime.fetch,\n baseURL,\n });\n\n const model =\n runtime.getSetting('OLLAMA_SMALL_MODEL') ||\n runtime.getSetting('SMALL_MODEL') ||\n 'gemma3:latest';\n\n logger.log(`[Ollama] Using TEXT_SMALL model: ${model}`);\n await ensureModelAvailable(runtime, model, baseURL);\n logger.log('generating text');\n logger.log(prompt);\n\n return await generateOllamaText(ollama, model, {\n prompt,\n system: runtime.character?.system || undefined,\n temperature,\n maxTokens: max_response_length,\n frequencyPenalty: frequency_penalty,\n presencePenalty: presence_penalty,\n stopSequences,\n });\n } catch (error) {\n logger.error({ error }, 'Error in TEXT_SMALL model');\n return 'Error generating text. Please try again later.';\n }\n },\n [ModelType.TEXT_LARGE]: async (\n runtime,\n {\n prompt,\n stopSequences = [],\n maxTokens = 8192,\n temperature = 0.7,\n frequencyPenalty = 0.7,\n presencePenalty = 0.7,\n }: GenerateTextParams\n ) => {\n try {\n const model =\n runtime.getSetting('OLLAMA_LARGE_MODEL') ||\n runtime.getSetting('LARGE_MODEL') ||\n 'gemma3:latest';\n const baseURL = getBaseURL(runtime);\n const ollama = createOllama({\n fetch: runtime.fetch,\n baseURL,\n });\n\n logger.log(`[Ollama] Using TEXT_LARGE model: ${model}`);\n await ensureModelAvailable(runtime, model, baseURL);\n return await generateOllamaText(ollama, model, {\n prompt,\n system: runtime.character?.system || undefined,\n temperature,\n maxTokens,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n });\n } catch (error) {\n logger.error({ error }, 'Error in TEXT_LARGE model');\n return 'Error generating text. Please try again later.';\n }\n },\n [ModelType.OBJECT_SMALL]: async (runtime, params: ObjectGenerationParams) => {\n try {\n const baseURL = getBaseURL(runtime);\n const ollama = createOllama({\n fetch: runtime.fetch,\n baseURL,\n });\n const model =\n runtime.getSetting('OLLAMA_SMALL_MODEL') ||\n runtime.getSetting('SMALL_MODEL') ||\n 'gemma3:latest';\n\n logger.log(`[Ollama] Using OBJECT_SMALL model: ${model}`);\n await ensureModelAvailable(runtime, model, baseURL);\n if (params.schema) {\n logger.info('Using OBJECT_SMALL without schema validation');\n }\n\n return await generateOllamaObject(ollama, model, params);\n } catch (error) {\n logger.error({ error }, 'Error in OBJECT_SMALL model');\n // Return empty object instead of crashing\n return {};\n }\n },\n [ModelType.OBJECT_LARGE]: async (runtime, params: ObjectGenerationParams) => {\n try {\n const baseURL = getBaseURL(runtime);\n const ollama = createOllama({\n fetch: runtime.fetch,\n baseURL,\n });\n const model =\n runtime.getSetting('OLLAMA_LARGE_MODEL') ||\n runtime.getSetting('LARGE_MODEL') ||\n 'gemma3:latest';\n\n logger.log(`[Ollama] Using OBJECT_LARGE model: ${model}`);\n await ensureModelAvailable(runtime, model, baseURL);\n if (params.schema) {\n logger.info('Using OBJECT_LARGE without schema validation');\n }\n\n return await generateOllamaObject(ollama, model, params);\n } catch (error) {\n logger.error({ error }, 'Error in OBJECT_LARGE model');\n // Return empty object instead of crashing\n return {};\n }\n },\n },\n tests: [\n {\n name: 'ollama_plugin_tests',\n tests: [\n {\n name: 'ollama_test_url_validation',\n fn: async (runtime) => {\n try {\n const baseURL = getBaseURL(runtime);\n // Remove /api suffix for direct API calls\n const apiBase = baseURL.endsWith('/api') ? baseURL.slice(0, -4) : baseURL;\n const response = await fetch(`${apiBase}/api/tags`);\n const data = await response.json();\n const modelCount =\n data && typeof data === 'object' && 'models' in data && Array.isArray(data.models)\n ? data.models.length\n : 0;\n logger.log(`Models Available: ${modelCount}`);\n if (!response.ok) {\n logger.error(`Failed to validate Ollama API: ${response.statusText}`);\n return;\n }\n } catch (error) {\n logger.error({ error }, 'Error in ollama_test_url_validation');\n }\n },\n },\n {\n name: 'ollama_test_text_embedding',\n fn: async (runtime) => {\n try {\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: 'Hello, world!',\n });\n logger.log({ embedding }, 'Generated embedding');\n } catch (error) {\n logger.error({ error }, 'Error in test_text_embedding');\n }\n },\n },\n {\n name: 'ollama_test_text_large',\n fn: async (runtime) => {\n try {\n const text = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: 'What is the nature of reality in 10 words?',\n });\n if (text.length === 0) {\n logger.error('Failed to generate text');\n return;\n }\n logger.log({ text }, 'Generated with test_text_large');\n } catch (error) {\n logger.error({ error }, 'Error in test_text_large');\n }\n },\n },\n {\n name: 'ollama_test_text_small',\n fn: async (runtime) => {\n try {\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: 'What is the nature of reality in 10 words?',\n });\n if (text.length === 0) {\n logger.error('Failed to generate text');\n return;\n }\n logger.log({ text }, 'Generated with test_text_small');\n } catch (error) {\n logger.error({ error }, 'Error in test_text_small');\n }\n },\n },\n {\n name: 'ollama_test_object_small',\n fn: async (runtime) => {\n try {\n const object = await runtime.useModel(ModelType.OBJECT_SMALL, {\n prompt:\n 'Generate a JSON object representing a user profile with name, age, and hobbies',\n temperature: 0.7,\n schema: undefined,\n });\n logger.log({ object }, 'Generated object');\n } catch (error) {\n logger.error({ error }, 'Error in test_object_small');\n }\n },\n },\n {\n name: 'ollama_test_object_large',\n fn: async (runtime) => {\n try {\n const object = await runtime.useModel(ModelType.OBJECT_LARGE, {\n prompt:\n 'Generate a detailed JSON object representing a restaurant with name, cuisine type, menu items with prices, and customer reviews',\n temperature: 0.7,\n schema: undefined,\n });\n logger.log({ object }, 'Generated object');\n } catch (error) {\n logger.error({ error }, 'Error in test_object_large');\n }\n },\n },\n ],\n },\n ],\n};\nexport default ollamaPlugin;\n"],"mappings":"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","names":[]}