@mcp-abap-adt/ollama-embedder 11.0.0

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.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # @mcp-abap-adt/ollama-embedder
2
+
3
+ Ollama embedding provider for @mcp-abap-adt/llm-agent. Implements `IEmbedderBatch`; uses native `fetch`.
4
+
5
+ ## Exports
6
+
7
+ - `OllamaEmbedder` — implements IEmbedderBatch, calls Ollama /api/embeddings and /api/embed (batch).
8
+ - `OllamaRag` — convenience wrapper combining OllamaEmbedder with VectorRag.
9
+ - `OllamaEmbedderConfig` — configuration type.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ npm install @mcp-abap-adt/ollama-embedder
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```ts
20
+ import { OllamaEmbedder, OllamaRag } from '@mcp-abap-adt/ollama-embedder';
21
+
22
+ // Direct embedder usage
23
+ const embedder = new OllamaEmbedder({
24
+ ollamaUrl: 'http://localhost:11434',
25
+ model: 'nomic-embed-text',
26
+ });
27
+
28
+ const result = await embedder.embed('Hello world');
29
+ console.log(result.vector);
30
+
31
+ // Convenience RAG wrapper
32
+ const rag = new OllamaRag({
33
+ ollamaUrl: 'http://localhost:11434',
34
+ model: 'nomic-embed-text',
35
+ });
36
+
37
+ const searchResults = await rag.query('What is Ollama?', documents);
38
+ console.log(searchResults);
39
+ ```
40
+
41
+ Optional peer dependency of @mcp-abap-adt/llm-agent-server.
@@ -0,0 +1,3 @@
1
+ export type { OllamaEmbedderConfig } from './ollama.js';
2
+ export { OllamaEmbedder, OllamaRag } from './ollama.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { OllamaEmbedder, OllamaRag } from './ollama.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { IEmbedderBatch, IEmbedResult } from '@mcp-abap-adt/llm-agent';
2
+ import { type CallOptions, VectorRag, type VectorRagConfig } from '@mcp-abap-adt/llm-agent';
3
+ export interface OllamaEmbedderConfig {
4
+ /** Default: 'http://localhost:11434' */
5
+ ollamaUrl?: string;
6
+ /** Default: 'nomic-embed-text' */
7
+ model?: string;
8
+ /** Per-request timeout in milliseconds. Default: 30 000 */
9
+ timeoutMs?: number;
10
+ }
11
+ export declare class OllamaEmbedder implements IEmbedderBatch {
12
+ private readonly ollamaUrl;
13
+ private readonly model;
14
+ private readonly timeoutMs;
15
+ constructor(config?: OllamaEmbedderConfig);
16
+ embed(text: string, options?: CallOptions): Promise<IEmbedResult>;
17
+ embedBatch(texts: string[], options?: CallOptions): Promise<IEmbedResult[]>;
18
+ }
19
+ /**
20
+ * OllamaRag — convenience adapter that combines OllamaEmbedder with VectorRag.
21
+ */
22
+ export declare class OllamaRag extends VectorRag {
23
+ constructor(config?: OllamaEmbedderConfig & VectorRagConfig);
24
+ }
25
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EACL,KAAK,WAAW,EAEhB,SAAS,EACT,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAe,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,GAAE,oBAAyB;IAMvC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA8CjE,UAAU,CACd,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC;CA4C3B;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,SAAS;gBAC1B,MAAM,GAAE,oBAAoB,GAAG,eAAoB;CAIhE"}
package/dist/ollama.js ADDED
@@ -0,0 +1,92 @@
1
+ import { RagError, VectorRag, } from '@mcp-abap-adt/llm-agent';
2
+ export class OllamaEmbedder {
3
+ ollamaUrl;
4
+ model;
5
+ timeoutMs;
6
+ constructor(config = {}) {
7
+ this.ollamaUrl = config.ollamaUrl ?? 'http://localhost:11434';
8
+ this.model = config.model ?? 'nomic-embed-text';
9
+ this.timeoutMs = config.timeoutMs ?? 30_000;
10
+ }
11
+ async embed(text, options) {
12
+ const url = `${this.ollamaUrl}/api/embeddings`;
13
+ let lastError;
14
+ const maxRetries = 3;
15
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
16
+ try {
17
+ const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
18
+ const signal = options?.signal
19
+ ? AbortSignal.any([options.signal, timeoutSignal])
20
+ : timeoutSignal;
21
+ const res = await fetch(url, {
22
+ method: 'POST',
23
+ headers: { 'Content-Type': 'application/json' },
24
+ body: JSON.stringify({ model: this.model, prompt: text }),
25
+ signal,
26
+ });
27
+ if (!res.ok) {
28
+ const errorText = await res.text();
29
+ throw new RagError(`Ollama embed error: HTTP ${res.status} - ${errorText}`, 'EMBED_ERROR');
30
+ }
31
+ const json = (await res.json());
32
+ return { vector: json.embedding };
33
+ }
34
+ catch (err) {
35
+ lastError = err instanceof Error ? err : new Error(String(err));
36
+ if (err instanceof Error && err.name === 'AbortError')
37
+ throw err;
38
+ // Exponential backoff: 500ms, 1000ms, 2000ms
39
+ const delay = 500 * 2 ** attempt;
40
+ await new Promise((resolve) => setTimeout(resolve, delay));
41
+ }
42
+ }
43
+ throw (lastError ||
44
+ new RagError('Ollama embed failed after retries', 'EMBED_ERROR'));
45
+ }
46
+ async embedBatch(texts, options) {
47
+ if (texts.length === 0)
48
+ return [];
49
+ const url = `${this.ollamaUrl}/api/embed`;
50
+ let lastError;
51
+ const maxRetries = 3;
52
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
53
+ try {
54
+ const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
55
+ const signal = options?.signal
56
+ ? AbortSignal.any([options.signal, timeoutSignal])
57
+ : timeoutSignal;
58
+ const res = await fetch(url, {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify({ model: this.model, input: texts }),
62
+ signal,
63
+ });
64
+ if (!res.ok) {
65
+ const errorText = await res.text();
66
+ throw new RagError(`Ollama batch embed error: HTTP ${res.status} - ${errorText}`, 'EMBED_ERROR');
67
+ }
68
+ const json = (await res.json());
69
+ return json.embeddings.map((vector) => ({ vector }));
70
+ }
71
+ catch (err) {
72
+ lastError = err instanceof Error ? err : new Error(String(err));
73
+ if (err instanceof Error && err.name === 'AbortError')
74
+ throw err;
75
+ const delay = 500 * 2 ** attempt;
76
+ await new Promise((resolve) => setTimeout(resolve, delay));
77
+ }
78
+ }
79
+ throw (lastError ||
80
+ new RagError('Ollama batch embed failed after retries', 'EMBED_ERROR'));
81
+ }
82
+ }
83
+ /**
84
+ * OllamaRag — convenience adapter that combines OllamaEmbedder with VectorRag.
85
+ */
86
+ export class OllamaRag extends VectorRag {
87
+ constructor(config = {}) {
88
+ const embedder = new OllamaEmbedder(config);
89
+ super(embedder, config);
90
+ }
91
+ }
92
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@mcp-abap-adt/ollama-embedder",
3
+ "version": "11.0.0",
4
+ "description": "Ollama embedding provider and OllamaRag convenience class for @mcp-abap-adt/llm-agent.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "clean": "tsc -p tsconfig.json --clean",
23
+ "test": "node --import tsx/esm --test --test-reporter=spec 'src/**/*.test.ts'"
24
+ },
25
+ "dependencies": {
26
+ "@mcp-abap-adt/llm-agent": "*"
27
+ },
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/fr0ster/llm-agent.git"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ }
36
+ }