@mcp-abap-adt/llm-agent 12.0.2 → 12.0.4
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/dist/interfaces/agent-contracts.d.ts +25 -0
- package/dist/interfaces/agent-contracts.d.ts.map +1 -1
- package/dist/interfaces/agent-contracts.js.map +1 -1
- package/dist/interfaces/builder.d.ts +55 -0
- package/dist/interfaces/builder.d.ts.map +1 -0
- package/dist/interfaces/builder.js +2 -0
- package/dist/interfaces/builder.js.map +1 -0
- package/dist/interfaces/health.d.ts +25 -0
- package/dist/interfaces/health.d.ts.map +1 -0
- package/dist/interfaces/health.js +2 -0
- package/dist/interfaces/health.js.map +1 -0
- package/dist/interfaces/index.d.ts +13 -2
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/index.js.map +1 -1
- package/dist/interfaces/mcp-connection-strategy.d.ts +26 -0
- package/dist/interfaces/mcp-connection-strategy.d.ts.map +1 -0
- package/dist/interfaces/mcp-connection-strategy.js +2 -0
- package/dist/interfaces/mcp-connection-strategy.js.map +1 -0
- package/dist/interfaces/metrics.d.ts +58 -0
- package/dist/interfaces/metrics.d.ts.map +1 -0
- package/dist/interfaces/metrics.js +9 -0
- package/dist/interfaces/metrics.js.map +1 -0
- package/dist/interfaces/model-resolver.d.ts +9 -0
- package/dist/interfaces/model-resolver.d.ts.map +1 -0
- package/dist/interfaces/model-resolver.js +2 -0
- package/dist/interfaces/model-resolver.js.map +1 -0
- package/dist/interfaces/pipeline.d.ts +52 -0
- package/dist/interfaces/pipeline.d.ts.map +1 -0
- package/dist/interfaces/pipeline.js +9 -0
- package/dist/interfaces/pipeline.js.map +1 -0
- package/dist/interfaces/plugin.d.ts +81 -1
- package/dist/interfaces/plugin.d.ts.map +1 -1
- package/dist/interfaces/reranker.d.ts +5 -0
- package/dist/interfaces/reranker.d.ts.map +1 -0
- package/dist/interfaces/reranker.js +2 -0
- package/dist/interfaces/reranker.js.map +1 -0
- package/dist/interfaces/session.d.ts +7 -0
- package/dist/interfaces/session.d.ts.map +1 -0
- package/dist/interfaces/session.js +2 -0
- package/dist/interfaces/session.js.map +1 -0
- package/dist/interfaces/tracer.d.ts +17 -0
- package/dist/interfaces/tracer.d.ts.map +1 -0
- package/dist/interfaces/tracer.js +2 -0
- package/dist/interfaces/tracer.js.map +1 -0
- package/dist/interfaces/validator.d.ts +18 -0
- package/dist/interfaces/validator.d.ts.map +1 -0
- package/dist/interfaces/validator.js +8 -0
- package/dist/interfaces/validator.js.map +1 -0
- package/package.json +1 -1
- package/dist/rag/embedder-factories.d.ts +0 -9
- package/dist/rag/embedder-factories.d.ts.map +0 -1
- package/dist/rag/embedder-factories.js +0 -33
- package/dist/rag/embedder-factories.js.map +0 -1
- package/dist/rag/ollama-rag.d.ts +0 -26
- package/dist/rag/ollama-rag.d.ts.map +0 -1
- package/dist/rag/ollama-rag.js +0 -93
- package/dist/rag/ollama-rag.js.map +0 -1
- package/dist/rag/openai-embedder.d.ts +0 -22
- package/dist/rag/openai-embedder.d.ts.map +0 -1
- package/dist/rag/openai-embedder.js +0 -122
- package/dist/rag/openai-embedder.js.map +0 -1
- package/dist/rag/providers/qdrant-rag-provider.d.ts +0 -39
- package/dist/rag/providers/qdrant-rag-provider.d.ts.map +0 -1
- package/dist/rag/providers/qdrant-rag-provider.js +0 -93
- package/dist/rag/providers/qdrant-rag-provider.js.map +0 -1
- package/dist/rag/qdrant-rag.d.ts +0 -31
- package/dist/rag/qdrant-rag.d.ts.map +0 -1
- package/dist/rag/qdrant-rag.js +0 -300
- package/dist/rag/qdrant-rag.js.map +0 -1
- package/dist/rag/sap-ai-core-embedder.d.ts +0 -22
- package/dist/rag/sap-ai-core-embedder.d.ts.map +0 -1
- package/dist/rag/sap-ai-core-embedder.js +0 -56
- package/dist/rag/sap-ai-core-embedder.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/interfaces/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAe,SAAQ,eAAe;gBACrC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAoB;CAItD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,EAClD,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;CACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/interfaces/validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ7C,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,YAAY,OAAe,EAAE,IAAI,GAAG,iBAAiB;QACnD,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Built-in embedder factories for declarative (YAML) embedder selection.
|
|
3
|
-
*
|
|
4
|
-
* Consumers can extend this map with custom factories via
|
|
5
|
-
* `SmartAgentBuilder.withEmbedderFactory()` or `SmartServerConfig.embedderFactories`.
|
|
6
|
-
*/
|
|
7
|
-
import type { EmbedderFactory } from '../interfaces/rag.js';
|
|
8
|
-
export declare const builtInEmbedderFactories: Record<string, EmbedderFactory>;
|
|
9
|
-
//# sourceMappingURL=embedder-factories.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedder-factories.d.ts","sourceRoot":"","sources":["../../src/rag/embedder-factories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAyBpE,CAAC"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Built-in embedder factories for declarative (YAML) embedder selection.
|
|
3
|
-
*
|
|
4
|
-
* Consumers can extend this map with custom factories via
|
|
5
|
-
* `SmartAgentBuilder.withEmbedderFactory()` or `SmartServerConfig.embedderFactories`.
|
|
6
|
-
*/
|
|
7
|
-
export const builtInEmbedderFactories = {
|
|
8
|
-
// Task 12: ollama embedder factory restored and moved to server package
|
|
9
|
-
// ollama: (cfg) =>
|
|
10
|
-
// new OllamaEmbedder({
|
|
11
|
-
// ollamaUrl: cfg.url,
|
|
12
|
-
// model: cfg.model,
|
|
13
|
-
// timeoutMs: cfg.timeoutMs,
|
|
14
|
-
// }),
|
|
15
|
-
// Task 12: openai embedder factory restored and moved to server package
|
|
16
|
-
// openai: (cfg) => {
|
|
17
|
-
// if (!cfg.apiKey) {
|
|
18
|
-
// throw new Error('API key is required for openai embedder');
|
|
19
|
-
// }
|
|
20
|
-
// return new OpenAiEmbedder({
|
|
21
|
-
// apiKey: cfg.apiKey,
|
|
22
|
-
// baseURL: cfg.url,
|
|
23
|
-
// model: cfg.model,
|
|
24
|
-
// timeoutMs: cfg.timeoutMs,
|
|
25
|
-
// });
|
|
26
|
-
// },
|
|
27
|
-
// Task 12: sap-ai-core embedder factory restored and moved to server package
|
|
28
|
-
// 'sap-ai-core': (cfg) =>
|
|
29
|
-
// new SapAiCoreEmbedder({
|
|
30
|
-
// model: cfg.model ?? 'text-embedding-3-small',
|
|
31
|
-
// }),
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=embedder-factories.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedder-factories.js","sourceRoot":"","sources":["../../src/rag/embedder-factories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,wBAAwB,GAAoC;AACvE,wEAAwE;AACxE,mBAAmB;AACnB,yBAAyB;AACzB,0BAA0B;AAC1B,wBAAwB;AACxB,gCAAgC;AAChC,QAAQ;AACR,wEAAwE;AACxE,qBAAqB;AACrB,uBAAuB;AACvB,kEAAkE;AAClE,MAAM;AACN,gCAAgC;AAChC,0BAA0B;AAC1B,wBAAwB;AACxB,wBAAwB;AACxB,gCAAgC;AAChC,QAAQ;AACR,KAAK;AACL,6EAA6E;AAC7E,0BAA0B;AAC1B,4BAA4B;AAC5B,oDAAoD;AACpD,QAAQ;CACT,CAAC"}
|
package/dist/rag/ollama-rag.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { IEmbedderBatch, IEmbedResult } from '../interfaces/rag.js';
|
|
2
|
-
import { type CallOptions } from '../interfaces/types.js';
|
|
3
|
-
import { VectorRag, type VectorRagConfig } from './vector-rag.js';
|
|
4
|
-
export interface OllamaEmbedderConfig {
|
|
5
|
-
/** Default: 'http://localhost:11434' */
|
|
6
|
-
ollamaUrl?: string;
|
|
7
|
-
/** Default: 'nomic-embed-text' */
|
|
8
|
-
model?: string;
|
|
9
|
-
/** Per-request timeout in milliseconds. Default: 30 000 */
|
|
10
|
-
timeoutMs?: number;
|
|
11
|
-
}
|
|
12
|
-
export declare class OllamaEmbedder implements IEmbedderBatch {
|
|
13
|
-
private readonly ollamaUrl;
|
|
14
|
-
private readonly model;
|
|
15
|
-
private readonly timeoutMs;
|
|
16
|
-
constructor(config?: OllamaEmbedderConfig);
|
|
17
|
-
embed(text: string, options?: CallOptions): Promise<IEmbedResult>;
|
|
18
|
-
embedBatch(texts: string[], options?: CallOptions): Promise<IEmbedResult[]>;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* OllamaRag — convenience adapter that combines OllamaEmbedder with VectorRag.
|
|
22
|
-
*/
|
|
23
|
-
export declare class OllamaRag extends VectorRag {
|
|
24
|
-
constructor(config?: OllamaEmbedderConfig & VectorRagConfig);
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=ollama-rag.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-rag.d.ts","sourceRoot":"","sources":["../../src/rag/ollama-rag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,KAAK,WAAW,EAAY,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElE,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/rag/ollama-rag.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { RagError } from '../interfaces/types.js';
|
|
2
|
-
import { VectorRag } from './vector-rag.js';
|
|
3
|
-
export class OllamaEmbedder {
|
|
4
|
-
ollamaUrl;
|
|
5
|
-
model;
|
|
6
|
-
timeoutMs;
|
|
7
|
-
constructor(config = {}) {
|
|
8
|
-
this.ollamaUrl = config.ollamaUrl ?? 'http://localhost:11434';
|
|
9
|
-
this.model = config.model ?? 'nomic-embed-text';
|
|
10
|
-
this.timeoutMs = config.timeoutMs ?? 30_000;
|
|
11
|
-
}
|
|
12
|
-
async embed(text, options) {
|
|
13
|
-
const url = `${this.ollamaUrl}/api/embeddings`;
|
|
14
|
-
let lastError;
|
|
15
|
-
const maxRetries = 3;
|
|
16
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
17
|
-
try {
|
|
18
|
-
const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
|
|
19
|
-
const signal = options?.signal
|
|
20
|
-
? AbortSignal.any([options.signal, timeoutSignal])
|
|
21
|
-
: timeoutSignal;
|
|
22
|
-
const res = await fetch(url, {
|
|
23
|
-
method: 'POST',
|
|
24
|
-
headers: { 'Content-Type': 'application/json' },
|
|
25
|
-
body: JSON.stringify({ model: this.model, prompt: text }),
|
|
26
|
-
signal,
|
|
27
|
-
});
|
|
28
|
-
if (!res.ok) {
|
|
29
|
-
const errorText = await res.text();
|
|
30
|
-
throw new RagError(`Ollama embed error: HTTP ${res.status} - ${errorText}`, 'EMBED_ERROR');
|
|
31
|
-
}
|
|
32
|
-
const json = (await res.json());
|
|
33
|
-
return { vector: json.embedding };
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
37
|
-
if (err instanceof Error && err.name === 'AbortError')
|
|
38
|
-
throw err;
|
|
39
|
-
// Exponential backoff: 500ms, 1000ms, 2000ms
|
|
40
|
-
const delay = 500 * 2 ** attempt;
|
|
41
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
throw (lastError ||
|
|
45
|
-
new RagError('Ollama embed failed after retries', 'EMBED_ERROR'));
|
|
46
|
-
}
|
|
47
|
-
async embedBatch(texts, options) {
|
|
48
|
-
if (texts.length === 0)
|
|
49
|
-
return [];
|
|
50
|
-
const url = `${this.ollamaUrl}/api/embed`;
|
|
51
|
-
let lastError;
|
|
52
|
-
const maxRetries = 3;
|
|
53
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
54
|
-
try {
|
|
55
|
-
const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
|
|
56
|
-
const signal = options?.signal
|
|
57
|
-
? AbortSignal.any([options.signal, timeoutSignal])
|
|
58
|
-
: timeoutSignal;
|
|
59
|
-
const res = await fetch(url, {
|
|
60
|
-
method: 'POST',
|
|
61
|
-
headers: { 'Content-Type': 'application/json' },
|
|
62
|
-
body: JSON.stringify({ model: this.model, input: texts }),
|
|
63
|
-
signal,
|
|
64
|
-
});
|
|
65
|
-
if (!res.ok) {
|
|
66
|
-
const errorText = await res.text();
|
|
67
|
-
throw new RagError(`Ollama batch embed error: HTTP ${res.status} - ${errorText}`, 'EMBED_ERROR');
|
|
68
|
-
}
|
|
69
|
-
const json = (await res.json());
|
|
70
|
-
return json.embeddings.map((vector) => ({ vector }));
|
|
71
|
-
}
|
|
72
|
-
catch (err) {
|
|
73
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
74
|
-
if (err instanceof Error && err.name === 'AbortError')
|
|
75
|
-
throw err;
|
|
76
|
-
const delay = 500 * 2 ** attempt;
|
|
77
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
throw (lastError ||
|
|
81
|
-
new RagError('Ollama batch embed failed after retries', 'EMBED_ERROR'));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* OllamaRag — convenience adapter that combines OllamaEmbedder with VectorRag.
|
|
86
|
-
*/
|
|
87
|
-
export class OllamaRag extends VectorRag {
|
|
88
|
-
constructor(config = {}) {
|
|
89
|
-
const embedder = new OllamaEmbedder(config);
|
|
90
|
-
super(embedder, config);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=ollama-rag.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-rag.js","sourceRoot":"","sources":["../../src/rag/ollama-rag.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { IEmbedderBatch, IEmbedResult } from '../interfaces/rag.js';
|
|
2
|
-
import { type CallOptions } from '../interfaces/types.js';
|
|
3
|
-
export interface OpenAiEmbedderConfig {
|
|
4
|
-
/** API key for OpenAI-compatible service */
|
|
5
|
-
apiKey: string;
|
|
6
|
-
/** API base URL. Default: 'https://api.openai.com/v1' */
|
|
7
|
-
baseURL?: string;
|
|
8
|
-
/** Embedding model. Default: 'text-embedding-3-small' */
|
|
9
|
-
model?: string;
|
|
10
|
-
/** Per-request timeout in milliseconds. Default: 30 000 */
|
|
11
|
-
timeoutMs?: number;
|
|
12
|
-
}
|
|
13
|
-
export declare class OpenAiEmbedder implements IEmbedderBatch {
|
|
14
|
-
private readonly baseURL;
|
|
15
|
-
private readonly apiKey;
|
|
16
|
-
private readonly model;
|
|
17
|
-
private readonly timeoutMs;
|
|
18
|
-
constructor(config: OpenAiEmbedderConfig);
|
|
19
|
-
embed(text: string, options?: CallOptions): Promise<IEmbedResult>;
|
|
20
|
-
embedBatch(texts: string[], options?: CallOptions): Promise<IEmbedResult[]>;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=openai-embedder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-embedder.d.ts","sourceRoot":"","sources":["../../src/rag/openai-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,KAAK,WAAW,EAAY,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAe,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,EAAE,oBAAoB;IAclC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwDjE,UAAU,CACd,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC;CAwE3B"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { RagError } from '../interfaces/types.js';
|
|
2
|
-
export class OpenAiEmbedder {
|
|
3
|
-
baseURL;
|
|
4
|
-
apiKey;
|
|
5
|
-
model;
|
|
6
|
-
timeoutMs;
|
|
7
|
-
constructor(config) {
|
|
8
|
-
this.apiKey = config.apiKey;
|
|
9
|
-
this.baseURL = (config.baseURL ?? 'https://api.openai.com/v1').replace(/\/$/, '');
|
|
10
|
-
this.model = config.model ?? 'text-embedding-3-small';
|
|
11
|
-
this.timeoutMs = config.timeoutMs ?? 30_000;
|
|
12
|
-
if (!this.apiKey) {
|
|
13
|
-
throw new Error('OpenAI API key is required for embedding');
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
async embed(text, options) {
|
|
17
|
-
const url = `${this.baseURL}/embeddings`;
|
|
18
|
-
let lastError;
|
|
19
|
-
const maxRetries = 3;
|
|
20
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
21
|
-
try {
|
|
22
|
-
const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
|
|
23
|
-
const signal = options?.signal
|
|
24
|
-
? AbortSignal.any([options.signal, timeoutSignal])
|
|
25
|
-
: timeoutSignal;
|
|
26
|
-
const res = await fetch(url, {
|
|
27
|
-
method: 'POST',
|
|
28
|
-
headers: {
|
|
29
|
-
'Content-Type': 'application/json',
|
|
30
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
31
|
-
},
|
|
32
|
-
body: JSON.stringify({ model: this.model, input: text }),
|
|
33
|
-
signal,
|
|
34
|
-
});
|
|
35
|
-
if (!res.ok) {
|
|
36
|
-
const errorText = await res.text();
|
|
37
|
-
throw new RagError(`OpenAI embed error: HTTP ${res.status} - ${errorText}`, 'EMBED_ERROR');
|
|
38
|
-
}
|
|
39
|
-
const json = (await res.json());
|
|
40
|
-
const vector = json.data[0].embedding;
|
|
41
|
-
const usage = json.usage
|
|
42
|
-
? {
|
|
43
|
-
promptTokens: json.usage.prompt_tokens,
|
|
44
|
-
totalTokens: json.usage.total_tokens,
|
|
45
|
-
}
|
|
46
|
-
: undefined;
|
|
47
|
-
return { vector, usage };
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
51
|
-
if (err instanceof Error && err.name === 'AbortError')
|
|
52
|
-
throw err;
|
|
53
|
-
const delay = 500 * 2 ** attempt;
|
|
54
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
throw (lastError ||
|
|
58
|
-
new RagError('OpenAI embed failed after retries', 'EMBED_ERROR'));
|
|
59
|
-
}
|
|
60
|
-
async embedBatch(texts, options) {
|
|
61
|
-
if (texts.length === 0)
|
|
62
|
-
return [];
|
|
63
|
-
const chunkSize = 100;
|
|
64
|
-
const results = new Array(texts.length);
|
|
65
|
-
for (let start = 0; start < texts.length; start += chunkSize) {
|
|
66
|
-
const chunk = texts.slice(start, start + chunkSize);
|
|
67
|
-
const url = `${this.baseURL}/embeddings`;
|
|
68
|
-
let lastError;
|
|
69
|
-
const maxRetries = 3;
|
|
70
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
71
|
-
try {
|
|
72
|
-
const timeoutSignal = AbortSignal.timeout(this.timeoutMs);
|
|
73
|
-
const signal = options?.signal
|
|
74
|
-
? AbortSignal.any([options.signal, timeoutSignal])
|
|
75
|
-
: timeoutSignal;
|
|
76
|
-
const res = await fetch(url, {
|
|
77
|
-
method: 'POST',
|
|
78
|
-
headers: {
|
|
79
|
-
'Content-Type': 'application/json',
|
|
80
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
81
|
-
},
|
|
82
|
-
body: JSON.stringify({ model: this.model, input: chunk }),
|
|
83
|
-
signal,
|
|
84
|
-
});
|
|
85
|
-
if (!res.ok) {
|
|
86
|
-
const errorText = await res.text();
|
|
87
|
-
throw new RagError(`OpenAI batch embed error: HTTP ${res.status} - ${errorText}`, 'EMBED_ERROR');
|
|
88
|
-
}
|
|
89
|
-
const json = (await res.json());
|
|
90
|
-
const sorted = json.data.sort((a, b) => a.index - b.index);
|
|
91
|
-
const chunkLen = sorted.length;
|
|
92
|
-
const usagePerItem = json.usage
|
|
93
|
-
? {
|
|
94
|
-
promptTokens: Math.round(json.usage.prompt_tokens / chunkLen),
|
|
95
|
-
totalTokens: Math.round(json.usage.total_tokens / chunkLen),
|
|
96
|
-
}
|
|
97
|
-
: undefined;
|
|
98
|
-
for (let i = 0; i < sorted.length; i++) {
|
|
99
|
-
results[start + i] = {
|
|
100
|
-
vector: sorted[i].embedding,
|
|
101
|
-
usage: usagePerItem,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
lastError = undefined;
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
catch (err) {
|
|
108
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
109
|
-
if (err instanceof Error && err.name === 'AbortError')
|
|
110
|
-
throw err;
|
|
111
|
-
const delay = 500 * 2 ** attempt;
|
|
112
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
if (lastError) {
|
|
116
|
-
throw lastError;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return results;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=openai-embedder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-embedder.js","sourceRoot":"","sources":["../../src/rag/openai-embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { IEmbedder, IIdStrategy, IRag, IRagEditor, RagCollectionScope } from '../../interfaces/rag.js';
|
|
2
|
-
import { RagError, type Result } from '../../interfaces/types.js';
|
|
3
|
-
import { AbstractRagProvider } from './base-provider.js';
|
|
4
|
-
export interface QdrantRagProviderConfig {
|
|
5
|
-
name: string;
|
|
6
|
-
url: string;
|
|
7
|
-
apiKey?: string;
|
|
8
|
-
embedder: IEmbedder;
|
|
9
|
-
editable?: boolean;
|
|
10
|
-
timeoutMs?: number;
|
|
11
|
-
supportedScopes?: readonly RagCollectionScope[];
|
|
12
|
-
idStrategyFactory?: (opts: {
|
|
13
|
-
scope: RagCollectionScope;
|
|
14
|
-
sessionId?: string;
|
|
15
|
-
userId?: string;
|
|
16
|
-
}) => IIdStrategy;
|
|
17
|
-
}
|
|
18
|
-
export declare class QdrantRagProvider extends AbstractRagProvider {
|
|
19
|
-
readonly name: string;
|
|
20
|
-
readonly kind = "vector";
|
|
21
|
-
readonly editable: boolean;
|
|
22
|
-
readonly supportedScopes: readonly RagCollectionScope[];
|
|
23
|
-
private readonly url;
|
|
24
|
-
private readonly apiKey?;
|
|
25
|
-
private readonly embedder;
|
|
26
|
-
private readonly timeoutMs?;
|
|
27
|
-
constructor(cfg: QdrantRagProviderConfig);
|
|
28
|
-
createCollection(name: string, opts: {
|
|
29
|
-
scope: RagCollectionScope;
|
|
30
|
-
sessionId?: string;
|
|
31
|
-
userId?: string;
|
|
32
|
-
}): Promise<Result<{
|
|
33
|
-
rag: IRag;
|
|
34
|
-
editor: IRagEditor;
|
|
35
|
-
}, RagError>>;
|
|
36
|
-
deleteCollection(name: string): Promise<Result<void, RagError>>;
|
|
37
|
-
listCollections(): Promise<Result<string[], RagError>>;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=qdrant-rag-provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant-rag-provider.d.ts","sourceRoot":"","sources":["../../../src/rag/providers/qdrant-rag-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,IAAI,EACJ,UAAU,EACV,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,kBAAkB,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAK,WAAW,CAAC;CACnB;AAED,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;gBAExB,GAAG,EAAE,uBAAuB;IAYlC,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QACJ,KAAK,EAAE,kBAAkB,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,OAAO,CAAC,MAAM,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,EAAE,QAAQ,CAAC,CAAC;IAczD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IA6B/D,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;CA6B7D"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { RagError } from '../../interfaces/types.js';
|
|
2
|
-
import { QdrantRag } from '../qdrant-rag.js';
|
|
3
|
-
import { AbstractRagProvider } from './base-provider.js';
|
|
4
|
-
export class QdrantRagProvider extends AbstractRagProvider {
|
|
5
|
-
name;
|
|
6
|
-
kind = 'vector';
|
|
7
|
-
editable;
|
|
8
|
-
supportedScopes;
|
|
9
|
-
url;
|
|
10
|
-
apiKey;
|
|
11
|
-
embedder;
|
|
12
|
-
timeoutMs;
|
|
13
|
-
constructor(cfg) {
|
|
14
|
-
super();
|
|
15
|
-
this.name = cfg.name;
|
|
16
|
-
this.url = cfg.url.replace(/\/+$/, '');
|
|
17
|
-
this.apiKey = cfg.apiKey;
|
|
18
|
-
this.embedder = cfg.embedder;
|
|
19
|
-
this.timeoutMs = cfg.timeoutMs;
|
|
20
|
-
this.editable = cfg.editable ?? true;
|
|
21
|
-
this.supportedScopes = cfg.supportedScopes ?? ['session', 'user', 'global'];
|
|
22
|
-
if (cfg.idStrategyFactory)
|
|
23
|
-
this.idStrategyFactory = cfg.idStrategyFactory;
|
|
24
|
-
}
|
|
25
|
-
async createCollection(name, opts) {
|
|
26
|
-
const scopeCheck = this.checkScope(opts.scope);
|
|
27
|
-
if (!scopeCheck.ok)
|
|
28
|
-
return scopeCheck;
|
|
29
|
-
const rag = new QdrantRag({
|
|
30
|
-
url: this.url,
|
|
31
|
-
apiKey: this.apiKey,
|
|
32
|
-
embedder: this.embedder,
|
|
33
|
-
collectionName: name,
|
|
34
|
-
timeoutMs: this.timeoutMs,
|
|
35
|
-
});
|
|
36
|
-
const editor = this.buildEditor(rag, this.pickIdStrategy(opts));
|
|
37
|
-
return { ok: true, value: { rag, editor } };
|
|
38
|
-
}
|
|
39
|
-
async deleteCollection(name) {
|
|
40
|
-
try {
|
|
41
|
-
const headers = {
|
|
42
|
-
'Content-Type': 'application/json',
|
|
43
|
-
};
|
|
44
|
-
if (this.apiKey)
|
|
45
|
-
headers['api-key'] = this.apiKey;
|
|
46
|
-
const res = await fetch(`${this.url}/collections/${name}`, {
|
|
47
|
-
method: 'DELETE',
|
|
48
|
-
headers,
|
|
49
|
-
});
|
|
50
|
-
if (!res.ok) {
|
|
51
|
-
const body = await res.text();
|
|
52
|
-
return {
|
|
53
|
-
ok: false,
|
|
54
|
-
error: new RagError(`Qdrant delete collection failed: ${body}`, 'RAG_DELETE_ERROR'),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
return { ok: true, value: undefined };
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
return {
|
|
61
|
-
ok: false,
|
|
62
|
-
error: new RagError(String(err), 'RAG_DELETE_ERROR'),
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async listCollections() {
|
|
67
|
-
try {
|
|
68
|
-
const headers = {
|
|
69
|
-
'Content-Type': 'application/json',
|
|
70
|
-
};
|
|
71
|
-
if (this.apiKey)
|
|
72
|
-
headers['api-key'] = this.apiKey;
|
|
73
|
-
const res = await fetch(`${this.url}/collections`, { headers });
|
|
74
|
-
if (!res.ok) {
|
|
75
|
-
const body = await res.text();
|
|
76
|
-
return {
|
|
77
|
-
ok: false,
|
|
78
|
-
error: new RagError(`Qdrant list collections failed: ${body}`, 'RAG_LIST_ERROR'),
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
const json = (await res.json());
|
|
82
|
-
const names = json.result?.collections?.map((c) => c.name) ?? [];
|
|
83
|
-
return { ok: true, value: names };
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
return {
|
|
87
|
-
ok: false,
|
|
88
|
-
error: new RagError(String(err), 'RAG_LIST_ERROR'),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=qdrant-rag-provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant-rag-provider.js","sourceRoot":"","sources":["../../../src/rag/providers/qdrant-rag-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/rag/qdrant-rag.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { IQueryEmbedding } from '../interfaces/query-embedding.js';
|
|
2
|
-
import type { IEmbedder, IRag, IRagBackendWriter } from '../interfaces/rag.js';
|
|
3
|
-
import { type CallOptions, RagError, type RagMetadata, type RagResult, type Result } from '../interfaces/types.js';
|
|
4
|
-
export interface QdrantRagConfig {
|
|
5
|
-
url: string;
|
|
6
|
-
collectionName: string;
|
|
7
|
-
embedder: IEmbedder;
|
|
8
|
-
apiKey?: string;
|
|
9
|
-
/** Per-request timeout in ms. Default: 30 000 */
|
|
10
|
-
timeoutMs?: number;
|
|
11
|
-
}
|
|
12
|
-
export declare class QdrantRag implements IRag {
|
|
13
|
-
private readonly url;
|
|
14
|
-
private readonly collectionName;
|
|
15
|
-
private readonly embedder;
|
|
16
|
-
private readonly apiKey?;
|
|
17
|
-
private readonly timeoutMs;
|
|
18
|
-
private collectionEnsured;
|
|
19
|
-
constructor(config: QdrantRagConfig);
|
|
20
|
-
private _headers;
|
|
21
|
-
private _fetch;
|
|
22
|
-
private _ensureCollection;
|
|
23
|
-
private upsertKnownVector;
|
|
24
|
-
upsert(text: string, metadata: RagMetadata, options?: CallOptions): Promise<Result<void, RagError>>;
|
|
25
|
-
upsertPrecomputed(text: string, vector: number[], metadata: RagMetadata, options?: CallOptions): Promise<Result<void, RagError>>;
|
|
26
|
-
query(embedding: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
|
|
27
|
-
getById(id: string, options?: CallOptions): Promise<Result<RagResult | null, RagError>>;
|
|
28
|
-
healthCheck(options?: CallOptions): Promise<Result<void, RagError>>;
|
|
29
|
-
writer(): IRagBackendWriter;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=qdrant-rag.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant-rag.d.ts","sourceRoot":"","sources":["../../src/rag/qdrant-rag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,KAAK,WAAW,EAChB,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,MAAM,EACZ,MAAM,wBAAwB,CAAC;AAehC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAU,YAAW,IAAI;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,MAAM,EAAE,eAAe;IAQnC,OAAO,CAAC,QAAQ;YAMF,MAAM;YAuBN,iBAAiB;YAmCjB,iBAAiB;IA0CzB,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAa5B,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAO5B,KAAK,CACT,SAAS,EAAE,eAAe,EAC1B,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;IA6EnC,OAAO,CACX,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;IAyCxC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IA4BzE,MAAM,IAAI,iBAAiB;CAuE5B"}
|