@mcp-abap-adt/qdrant-rag 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,5 @@
1
+ # @mcp-abap-adt/qdrant-rag
2
+
3
+ QdrantRag vector store and QdrantRagProvider for @mcp-abap-adt/llm-agent.
4
+
5
+ Provides vector search capabilities using Qdrant as the backend.
@@ -0,0 +1,5 @@
1
+ export type { QdrantRagConfig } from './qdrant-rag.js';
2
+ export { QdrantRag } from './qdrant-rag.js';
3
+ export type { QdrantRagProviderConfig } from './qdrant-rag-provider.js';
4
+ export { QdrantRagProvider } from './qdrant-rag-provider.js';
5
+ //# 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,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { QdrantRag } from './qdrant-rag.js';
2
+ export { QdrantRagProvider } from './qdrant-rag-provider.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { IEmbedder, IIdStrategy, IRag, IRagEditor, RagCollectionScope } from '@mcp-abap-adt/llm-agent';
2
+ import { AbstractRagProvider as BaseRagProvider, RagError, type Result } from '@mcp-abap-adt/llm-agent';
3
+ export interface QdrantRagProviderConfig {
4
+ name: string;
5
+ url: string;
6
+ apiKey?: string;
7
+ embedder: IEmbedder;
8
+ editable?: boolean;
9
+ timeoutMs?: number;
10
+ supportedScopes?: readonly RagCollectionScope[];
11
+ idStrategyFactory?: (opts: {
12
+ scope: RagCollectionScope;
13
+ sessionId?: string;
14
+ userId?: string;
15
+ }) => IIdStrategy;
16
+ }
17
+ export declare class QdrantRagProvider extends BaseRagProvider {
18
+ readonly name: string;
19
+ readonly kind = "vector";
20
+ readonly editable: boolean;
21
+ readonly supportedScopes: readonly RagCollectionScope[];
22
+ private readonly url;
23
+ private readonly apiKey?;
24
+ private readonly embedder;
25
+ private readonly timeoutMs?;
26
+ constructor(cfg: QdrantRagProviderConfig);
27
+ createCollection(name: string, opts: {
28
+ scope: RagCollectionScope;
29
+ sessionId?: string;
30
+ userId?: string;
31
+ }): Promise<Result<{
32
+ rag: IRag;
33
+ editor: IRagEditor;
34
+ }, RagError>>;
35
+ deleteCollection(name: string): Promise<Result<void, RagError>>;
36
+ listCollections(): Promise<Result<string[], RagError>>;
37
+ }
38
+ //# sourceMappingURL=qdrant-rag-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag-provider.d.ts","sourceRoot":"","sources":["../src/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,EACL,mBAAmB,IAAI,eAAe,EACtC,QAAQ,EACR,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAGjC,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,eAAe;IACpD,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"}
@@ -0,0 +1,92 @@
1
+ import { AbstractRagProvider as BaseRagProvider, RagError, } from '@mcp-abap-adt/llm-agent';
2
+ import { QdrantRag } from './qdrant-rag.js';
3
+ export class QdrantRagProvider extends BaseRagProvider {
4
+ name;
5
+ kind = 'vector';
6
+ editable;
7
+ supportedScopes;
8
+ url;
9
+ apiKey;
10
+ embedder;
11
+ timeoutMs;
12
+ constructor(cfg) {
13
+ super();
14
+ this.name = cfg.name;
15
+ this.url = cfg.url.replace(/\/+$/, '');
16
+ this.apiKey = cfg.apiKey;
17
+ this.embedder = cfg.embedder;
18
+ this.timeoutMs = cfg.timeoutMs;
19
+ this.editable = cfg.editable ?? true;
20
+ this.supportedScopes = cfg.supportedScopes ?? ['session', 'user', 'global'];
21
+ if (cfg.idStrategyFactory)
22
+ this.idStrategyFactory = cfg.idStrategyFactory;
23
+ }
24
+ async createCollection(name, opts) {
25
+ const scopeCheck = this.checkScope(opts.scope);
26
+ if (!scopeCheck.ok)
27
+ return scopeCheck;
28
+ const rag = new QdrantRag({
29
+ url: this.url,
30
+ apiKey: this.apiKey,
31
+ embedder: this.embedder,
32
+ collectionName: name,
33
+ timeoutMs: this.timeoutMs,
34
+ });
35
+ const editor = this.buildEditor(rag, this.pickIdStrategy(opts));
36
+ return { ok: true, value: { rag, editor } };
37
+ }
38
+ async deleteCollection(name) {
39
+ try {
40
+ const headers = {
41
+ 'Content-Type': 'application/json',
42
+ };
43
+ if (this.apiKey)
44
+ headers['api-key'] = this.apiKey;
45
+ const res = await fetch(`${this.url}/collections/${name}`, {
46
+ method: 'DELETE',
47
+ headers,
48
+ });
49
+ if (!res.ok) {
50
+ const body = await res.text();
51
+ return {
52
+ ok: false,
53
+ error: new RagError(`Qdrant delete collection failed: ${body}`, 'RAG_DELETE_ERROR'),
54
+ };
55
+ }
56
+ return { ok: true, value: undefined };
57
+ }
58
+ catch (err) {
59
+ return {
60
+ ok: false,
61
+ error: new RagError(String(err), 'RAG_DELETE_ERROR'),
62
+ };
63
+ }
64
+ }
65
+ async listCollections() {
66
+ try {
67
+ const headers = {
68
+ 'Content-Type': 'application/json',
69
+ };
70
+ if (this.apiKey)
71
+ headers['api-key'] = this.apiKey;
72
+ const res = await fetch(`${this.url}/collections`, { headers });
73
+ if (!res.ok) {
74
+ const body = await res.text();
75
+ return {
76
+ ok: false,
77
+ error: new RagError(`Qdrant list collections failed: ${body}`, 'RAG_LIST_ERROR'),
78
+ };
79
+ }
80
+ const json = (await res.json());
81
+ const names = json.result?.collections?.map((c) => c.name) ?? [];
82
+ return { ok: true, value: names };
83
+ }
84
+ catch (err) {
85
+ return {
86
+ ok: false,
87
+ error: new RagError(String(err), 'RAG_LIST_ERROR'),
88
+ };
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=qdrant-rag-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag-provider.js","sourceRoot":"","sources":["../src/qdrant-rag-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=qdrant-rag-provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag-provider.test.d.ts","sourceRoot":"","sources":["../src/qdrant-rag-provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,159 @@
1
+ import assert from 'node:assert/strict';
2
+ import http from 'node:http';
3
+ import { after, before, describe, it } from 'node:test';
4
+ import { UnsupportedScopeError } from '@mcp-abap-adt/llm-agent';
5
+ import { QdrantRag } from './qdrant-rag.js';
6
+ import { QdrantRagProvider } from './qdrant-rag-provider.js';
7
+ function makeEmbedder(dim = 3) {
8
+ return {
9
+ async embed(text) {
10
+ let hash = 0;
11
+ for (const ch of text)
12
+ hash = (hash * 31 + ch.charCodeAt(0)) | 0;
13
+ return {
14
+ vector: Array.from({ length: dim }, (_, i) => ((hash >> i) & 0xff) / 255),
15
+ };
16
+ },
17
+ };
18
+ }
19
+ function createStubServer(state) {
20
+ return http.createServer((req, res) => {
21
+ let body = '';
22
+ req.on('data', (c) => {
23
+ body += c;
24
+ });
25
+ req.on('end', () => {
26
+ const url = req.url ?? '';
27
+ const collMatch = url.match(/^\/collections\/([^/]+)$/);
28
+ if (collMatch && req.method === 'GET') {
29
+ const n = collMatch[1];
30
+ if (state.collections.has(n)) {
31
+ res.writeHead(200, { 'Content-Type': 'application/json' });
32
+ res.end(JSON.stringify({ result: { status: 'green' } }));
33
+ }
34
+ else {
35
+ res.writeHead(404);
36
+ res.end(JSON.stringify({ status: { error: 'missing' } }));
37
+ }
38
+ return;
39
+ }
40
+ if (collMatch && req.method === 'PUT' && !url.includes('/points')) {
41
+ state.collections.set(collMatch[1], []);
42
+ res.writeHead(200, { 'Content-Type': 'application/json' });
43
+ res.end(JSON.stringify({ result: true }));
44
+ return;
45
+ }
46
+ if (collMatch && req.method === 'DELETE') {
47
+ state.collections.delete(collMatch[1]);
48
+ res.writeHead(200, { 'Content-Type': 'application/json' });
49
+ res.end(JSON.stringify({ result: true }));
50
+ return;
51
+ }
52
+ if (url === '/collections' && req.method === 'GET') {
53
+ res.writeHead(200, { 'Content-Type': 'application/json' });
54
+ res.end(JSON.stringify({
55
+ result: {
56
+ collections: Array.from(state.collections.keys()).map((n) => ({
57
+ name: n,
58
+ })),
59
+ },
60
+ }));
61
+ return;
62
+ }
63
+ const upsertMatch = url.match(/^\/collections\/([^/]+)\/points$/);
64
+ if (upsertMatch && req.method === 'PUT') {
65
+ const coll = state.collections.get(upsertMatch[1]);
66
+ if (!coll) {
67
+ res.writeHead(404);
68
+ res.end();
69
+ return;
70
+ }
71
+ const data = JSON.parse(body);
72
+ for (const p of data.points)
73
+ coll.push({ id: p.id, vector: p.vector, payload: p.payload });
74
+ res.writeHead(200, { 'Content-Type': 'application/json' });
75
+ res.end(JSON.stringify({ result: { status: 'completed' } }));
76
+ return;
77
+ }
78
+ res.writeHead(404);
79
+ res.end('Not found');
80
+ });
81
+ });
82
+ }
83
+ describe('QdrantRagProvider', () => {
84
+ let server;
85
+ let baseUrl;
86
+ let state;
87
+ before(async () => {
88
+ state = { collections: new Map() };
89
+ server = createStubServer(state);
90
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
91
+ const addr = server.address();
92
+ if (typeof addr === 'object' && addr)
93
+ baseUrl = `http://127.0.0.1:${addr.port}`;
94
+ });
95
+ after(async () => {
96
+ await new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve())));
97
+ });
98
+ it('declares all three scopes as supported by default', () => {
99
+ const p = new QdrantRagProvider({
100
+ name: 'qdrant',
101
+ url: baseUrl,
102
+ embedder: makeEmbedder(),
103
+ });
104
+ assert.deepEqual([...p.supportedScopes].sort(), [
105
+ 'global',
106
+ 'session',
107
+ 'user',
108
+ ]);
109
+ });
110
+ it('creates a QdrantRag targeting the collection name', async () => {
111
+ const p = new QdrantRagProvider({
112
+ name: 'qdrant',
113
+ url: baseUrl,
114
+ embedder: makeEmbedder(),
115
+ });
116
+ const res = await p.createCollection('test-a', { scope: 'global' });
117
+ assert.ok(res.ok);
118
+ assert.ok(res.value.rag instanceof QdrantRag);
119
+ });
120
+ it('rejects unsupported scope when supportedScopes is restricted', async () => {
121
+ const p = new QdrantRagProvider({
122
+ name: 'q',
123
+ url: baseUrl,
124
+ embedder: makeEmbedder(),
125
+ supportedScopes: ['global'],
126
+ });
127
+ const res = await p.createCollection('x', {
128
+ scope: 'session',
129
+ sessionId: 'S',
130
+ });
131
+ assert.ok(!res.ok);
132
+ assert.ok(res.error instanceof UnsupportedScopeError);
133
+ });
134
+ it('deleteCollection removes the Qdrant collection', async () => {
135
+ state.collections.set('to-delete', []);
136
+ const p = new QdrantRagProvider({
137
+ name: 'q',
138
+ url: baseUrl,
139
+ embedder: makeEmbedder(),
140
+ });
141
+ const res = await p.deleteCollection?.('to-delete');
142
+ assert.ok(res?.ok);
143
+ assert.equal(state.collections.has('to-delete'), false);
144
+ });
145
+ it('listCollections returns collection names', async () => {
146
+ state.collections.set('coll-a', []);
147
+ state.collections.set('coll-b', []);
148
+ const p = new QdrantRagProvider({
149
+ name: 'q',
150
+ url: baseUrl,
151
+ embedder: makeEmbedder(),
152
+ });
153
+ const res = await p.listCollections?.();
154
+ assert.ok(res?.ok);
155
+ assert.ok(res.value.includes('coll-a'));
156
+ assert.ok(res.value.includes('coll-b'));
157
+ });
158
+ });
159
+ //# sourceMappingURL=qdrant-rag-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag-provider.test.js","sourceRoot":"","sources":["../src/qdrant-rag-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { IEmbedder, IQueryEmbedding, IRag, IRagBackendWriter } from '@mcp-abap-adt/llm-agent';
2
+ import { type CallOptions, RagError, type RagMetadata, type RagResult, type Result } from '@mcp-abap-adt/llm-agent';
3
+ export interface QdrantRagConfig {
4
+ url: string;
5
+ collectionName: string;
6
+ embedder: IEmbedder;
7
+ apiKey?: string;
8
+ /** Per-request timeout in ms. Default: 30 000 */
9
+ timeoutMs?: number;
10
+ }
11
+ export declare class QdrantRag implements IRag {
12
+ private readonly url;
13
+ private readonly collectionName;
14
+ private readonly embedder;
15
+ private readonly apiKey?;
16
+ private readonly timeoutMs;
17
+ private collectionEnsured;
18
+ constructor(config: QdrantRagConfig);
19
+ private _headers;
20
+ private _fetch;
21
+ private _ensureCollection;
22
+ private upsertKnownVector;
23
+ upsert(text: string, metadata: RagMetadata, options?: CallOptions): Promise<Result<void, RagError>>;
24
+ upsertPrecomputed(text: string, vector: number[], metadata: RagMetadata, options?: CallOptions): Promise<Result<void, RagError>>;
25
+ query(embedding: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
26
+ getById(id: string, options?: CallOptions): Promise<Result<RagResult | null, RagError>>;
27
+ healthCheck(options?: CallOptions): Promise<Result<void, RagError>>;
28
+ writer(): IRagBackendWriter;
29
+ }
30
+ //# sourceMappingURL=qdrant-rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag.d.ts","sourceRoot":"","sources":["../src/qdrant-rag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,IAAI,EACJ,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,WAAW,EAEhB,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAcjC,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"}
@@ -0,0 +1,299 @@
1
+ import { FallbackQueryEmbedding, RagError, } from '@mcp-abap-adt/llm-agent';
2
+ /**
3
+ * Derive a deterministic UUID from a stable string key using SHA-256.
4
+ * The first 16 bytes of the hash are formatted as a UUID v5-style string.
5
+ */
6
+ async function deterministicUUID(key) {
7
+ const data = new TextEncoder().encode(key);
8
+ const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', data);
9
+ const bytes = new Uint8Array(hashBuffer, 0, 16);
10
+ const hex = [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');
11
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
12
+ }
13
+ export class QdrantRag {
14
+ url;
15
+ collectionName;
16
+ embedder;
17
+ apiKey;
18
+ timeoutMs;
19
+ collectionEnsured = false;
20
+ constructor(config) {
21
+ this.url = config.url.replace(/\/+$/, '');
22
+ this.collectionName = config.collectionName;
23
+ this.embedder = config.embedder;
24
+ this.apiKey = config.apiKey;
25
+ this.timeoutMs = config.timeoutMs ?? 30_000;
26
+ }
27
+ _headers() {
28
+ const h = { 'Content-Type': 'application/json' };
29
+ if (this.apiKey)
30
+ h['api-key'] = this.apiKey;
31
+ return h;
32
+ }
33
+ async _fetch(path, init, signal) {
34
+ const ctrl = new AbortController();
35
+ const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
36
+ if (signal) {
37
+ signal.addEventListener('abort', () => ctrl.abort(signal.reason), {
38
+ once: true,
39
+ });
40
+ }
41
+ try {
42
+ return await fetch(`${this.url}${path}`, {
43
+ ...init,
44
+ signal: ctrl.signal,
45
+ headers: { ...this._headers(), ...(init.headers ?? {}) },
46
+ });
47
+ }
48
+ finally {
49
+ clearTimeout(timer);
50
+ }
51
+ }
52
+ async _ensureCollection(vectorSize, signal) {
53
+ if (this.collectionEnsured)
54
+ return;
55
+ const res = await this._fetch(`/collections/${this.collectionName}`, { method: 'GET' }, signal);
56
+ if (res.ok) {
57
+ this.collectionEnsured = true;
58
+ return;
59
+ }
60
+ // Collection doesn't exist — create it
61
+ const createRes = await this._fetch(`/collections/${this.collectionName}`, {
62
+ method: 'PUT',
63
+ body: JSON.stringify({
64
+ vectors: { size: vectorSize, distance: 'Cosine' },
65
+ }),
66
+ }, signal);
67
+ if (!createRes.ok) {
68
+ const text = await createRes.text();
69
+ throw new RagError(`Failed to create collection: ${text}`, 'UPSERT_ERROR');
70
+ }
71
+ this.collectionEnsured = true;
72
+ }
73
+ async upsertKnownVector(text, vector, metadata, options) {
74
+ try {
75
+ await this._ensureCollection(vector.length, options?.signal);
76
+ const pointId = metadata?.id
77
+ ? await deterministicUUID(metadata.id)
78
+ : crypto.randomUUID();
79
+ const payload = {
80
+ text,
81
+ ...metadata,
82
+ };
83
+ const res = await this._fetch(`/collections/${this.collectionName}/points`, {
84
+ method: 'PUT',
85
+ body: JSON.stringify({
86
+ points: [{ id: pointId, vector, payload }],
87
+ }),
88
+ }, options?.signal);
89
+ if (!res.ok) {
90
+ const body = await res.text();
91
+ return {
92
+ ok: false,
93
+ error: new RagError(`Qdrant upsert failed: ${body}`, 'UPSERT_ERROR'),
94
+ };
95
+ }
96
+ return { ok: true, value: undefined };
97
+ }
98
+ catch (err) {
99
+ if (err instanceof RagError)
100
+ return { ok: false, error: err };
101
+ return { ok: false, error: new RagError(String(err), 'UPSERT_ERROR') };
102
+ }
103
+ }
104
+ async upsert(text, metadata, options) {
105
+ if (options?.signal?.aborted) {
106
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
107
+ }
108
+ try {
109
+ const { vector } = await this.embedder.embed(text, options);
110
+ return this.upsertKnownVector(text, vector, metadata, options);
111
+ }
112
+ catch (err) {
113
+ if (err instanceof RagError)
114
+ return { ok: false, error: err };
115
+ return { ok: false, error: new RagError(String(err), 'UPSERT_ERROR') };
116
+ }
117
+ }
118
+ async upsertPrecomputed(text, vector, metadata, options) {
119
+ if (options?.signal?.aborted) {
120
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
121
+ }
122
+ return this.upsertKnownVector(text, vector, metadata, options);
123
+ }
124
+ async query(embedding, k, options) {
125
+ if (options?.signal?.aborted) {
126
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
127
+ }
128
+ try {
129
+ const safe = new FallbackQueryEmbedding(embedding, this.embedder);
130
+ const vector = await safe.toVector();
131
+ const must = [];
132
+ const targetNamespace = options?.ragFilter?.namespace;
133
+ if (targetNamespace !== undefined) {
134
+ must.push({ key: 'namespace', match: { value: targetNamespace } });
135
+ }
136
+ const nowSecs = Math.floor(Date.now() / 1000);
137
+ must.push({ key: 'ttl', range: { gt: nowSecs } });
138
+ const body = {
139
+ vector,
140
+ limit: k,
141
+ with_payload: true,
142
+ };
143
+ if (must.length > 0) {
144
+ body.filter = {
145
+ should: [
146
+ { must },
147
+ // Also match points without TTL set (no ttl field)
148
+ {
149
+ must_not: [{ key: 'ttl', range: { gte: 0 } }],
150
+ ...(targetNamespace !== undefined
151
+ ? {
152
+ must: [
153
+ { key: 'namespace', match: { value: targetNamespace } },
154
+ ],
155
+ }
156
+ : {}),
157
+ },
158
+ ],
159
+ };
160
+ }
161
+ const res = await this._fetch(`/collections/${this.collectionName}/points/search`, { method: 'POST', body: JSON.stringify(body) }, options?.signal);
162
+ if (!res.ok) {
163
+ const errBody = await res.text();
164
+ return {
165
+ ok: false,
166
+ error: new RagError(`Qdrant query failed: ${errBody}`, 'QUERY_ERROR'),
167
+ };
168
+ }
169
+ const json = (await res.json());
170
+ const results = (json.result ?? []).map((hit) => {
171
+ const { text: hitText, ...rest } = hit.payload;
172
+ return {
173
+ text: String(hitText ?? ''),
174
+ metadata: rest,
175
+ score: hit.score,
176
+ };
177
+ });
178
+ return { ok: true, value: results };
179
+ }
180
+ catch (err) {
181
+ if (err instanceof RagError)
182
+ return { ok: false, error: err };
183
+ return { ok: false, error: new RagError(String(err), 'QUERY_ERROR') };
184
+ }
185
+ }
186
+ async getById(id, options) {
187
+ if (options?.signal?.aborted) {
188
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
189
+ }
190
+ try {
191
+ const pointId = await deterministicUUID(id);
192
+ const res = await this._fetch(`/collections/${this.collectionName}/points`, {
193
+ method: 'POST',
194
+ body: JSON.stringify({ ids: [pointId], with_payload: true }),
195
+ }, options?.signal);
196
+ if (!res.ok) {
197
+ const body = await res.text();
198
+ return {
199
+ ok: false,
200
+ error: new RagError(`Qdrant retrieve failed: ${body}`, 'QUERY_ERROR'),
201
+ };
202
+ }
203
+ const json = (await res.json());
204
+ const hit = json.result?.[0];
205
+ if (!hit)
206
+ return { ok: true, value: null };
207
+ const { text: hitText, ...rest } = hit.payload;
208
+ return {
209
+ ok: true,
210
+ value: {
211
+ text: String(hitText ?? ''),
212
+ metadata: rest,
213
+ score: 1,
214
+ },
215
+ };
216
+ }
217
+ catch (err) {
218
+ if (err instanceof RagError)
219
+ return { ok: false, error: err };
220
+ return { ok: false, error: new RagError(String(err), 'QUERY_ERROR') };
221
+ }
222
+ }
223
+ async healthCheck(options) {
224
+ try {
225
+ const res = await this._fetch(`/collections/${this.collectionName}`, { method: 'GET' }, options?.signal);
226
+ if (!res.ok) {
227
+ return {
228
+ ok: false,
229
+ error: new RagError(`Qdrant collection not accessible: HTTP ${res.status}`, 'HEALTH_CHECK_ERROR'),
230
+ };
231
+ }
232
+ return { ok: true, value: undefined };
233
+ }
234
+ catch (err) {
235
+ return {
236
+ ok: false,
237
+ error: new RagError(`Qdrant health check failed: ${String(err)}`, 'HEALTH_CHECK_ERROR'),
238
+ };
239
+ }
240
+ }
241
+ writer() {
242
+ return {
243
+ upsertRaw: async (id, text, metadata, options) => {
244
+ const res = await this.upsert(text, { ...metadata, id }, options);
245
+ return res.ok ? { ok: true, value: undefined } : res;
246
+ },
247
+ deleteByIdRaw: async (id, options) => {
248
+ try {
249
+ const pointId = await deterministicUUID(id);
250
+ const res = await this._fetch(`/collections/${this.collectionName}/points/delete`, {
251
+ method: 'POST',
252
+ body: JSON.stringify({ points: [pointId] }),
253
+ }, options?.signal);
254
+ if (!res.ok) {
255
+ const body = await res.text();
256
+ return {
257
+ ok: false,
258
+ error: new RagError(`Qdrant delete failed: ${body}`, 'DELETE_ERROR'),
259
+ };
260
+ }
261
+ return { ok: true, value: true };
262
+ }
263
+ catch (err) {
264
+ if (err instanceof RagError)
265
+ return { ok: false, error: err };
266
+ return {
267
+ ok: false,
268
+ error: new RagError(String(err), 'DELETE_ERROR'),
269
+ };
270
+ }
271
+ },
272
+ clearAll: async () => {
273
+ try {
274
+ const res = await this._fetch(`/collections/${this.collectionName}/points/delete`, {
275
+ method: 'POST',
276
+ body: JSON.stringify({ filter: {} }),
277
+ });
278
+ if (!res.ok) {
279
+ const body = await res.text();
280
+ return {
281
+ ok: false,
282
+ error: new RagError(`Qdrant clear failed: ${body}`, 'CLEAR_ERROR'),
283
+ };
284
+ }
285
+ return { ok: true, value: undefined };
286
+ }
287
+ catch (err) {
288
+ if (err instanceof RagError)
289
+ return { ok: false, error: err };
290
+ return { ok: false, error: new RagError(String(err), 'CLEAR_ERROR') };
291
+ }
292
+ },
293
+ upsertPrecomputedRaw: async (id, text, vector, metadata, options) => {
294
+ return this.upsertPrecomputed(text, vector, { ...metadata, id }, options);
295
+ },
296
+ };
297
+ }
298
+ }
299
+ //# sourceMappingURL=qdrant-rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag.js","sourceRoot":"","sources":["../src/qdrant-rag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=qdrant-rag.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag.test.d.ts","sourceRoot":"","sources":["../src/qdrant-rag.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,285 @@
1
+ import assert from 'node:assert/strict';
2
+ import http from 'node:http';
3
+ import { after, before, describe, it } from 'node:test';
4
+ import { QueryEmbedding } from '@mcp-abap-adt/llm-agent';
5
+ import { QdrantRag } from './qdrant-rag.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Stub embedder
8
+ // ---------------------------------------------------------------------------
9
+ function makeEmbedder(dim = 3) {
10
+ return {
11
+ async embed(text) {
12
+ // Deterministic hash-based embedding
13
+ let hash = 0;
14
+ for (const ch of text)
15
+ hash = (hash * 31 + ch.charCodeAt(0)) | 0;
16
+ return {
17
+ vector: Array.from({ length: dim }, (_, i) => ((hash >> i) & 0xff) / 255),
18
+ };
19
+ },
20
+ };
21
+ }
22
+ function createStubServer(state) {
23
+ return http.createServer((req, res) => {
24
+ let body = '';
25
+ req.on('data', (chunk) => {
26
+ body += chunk;
27
+ });
28
+ req.on('end', () => {
29
+ const url = req.url ?? '';
30
+ // GET /collections/:name
31
+ const getCollMatch = url.match(/^\/collections\/([^/]+)$/);
32
+ if (getCollMatch && req.method === 'GET') {
33
+ const name = getCollMatch[1];
34
+ if (state.collections.has(name)) {
35
+ res.writeHead(200, { 'Content-Type': 'application/json' });
36
+ res.end(JSON.stringify({ result: { status: 'green' } }));
37
+ }
38
+ else {
39
+ res.writeHead(404, { 'Content-Type': 'application/json' });
40
+ res.end(JSON.stringify({ status: { error: 'Not found' } }));
41
+ }
42
+ return;
43
+ }
44
+ // PUT /collections/:name (create collection)
45
+ if (getCollMatch && req.method === 'PUT' && !url.includes('/points')) {
46
+ const name = getCollMatch[1];
47
+ state.collections.set(name, []);
48
+ res.writeHead(200, { 'Content-Type': 'application/json' });
49
+ res.end(JSON.stringify({ result: true }));
50
+ return;
51
+ }
52
+ // PUT /collections/:name/points (upsert)
53
+ const upsertMatch = url.match(/^\/collections\/([^/]+)\/points$/);
54
+ if (upsertMatch && req.method === 'PUT') {
55
+ const name = upsertMatch[1];
56
+ const data = JSON.parse(body);
57
+ const coll = state.collections.get(name);
58
+ if (!coll) {
59
+ res.writeHead(404, { 'Content-Type': 'application/json' });
60
+ res.end(JSON.stringify({ status: { error: 'Collection not found' } }));
61
+ return;
62
+ }
63
+ for (const p of data.points) {
64
+ coll.push({ id: p.id, vector: p.vector, payload: p.payload });
65
+ }
66
+ res.writeHead(200, { 'Content-Type': 'application/json' });
67
+ res.end(JSON.stringify({ result: { status: 'completed' } }));
68
+ return;
69
+ }
70
+ // POST /collections/:name/points (retrieve by ids)
71
+ const retrieveMatch = url.match(/^\/collections\/([^/]+)\/points$/);
72
+ if (retrieveMatch && req.method === 'POST') {
73
+ const name = retrieveMatch[1];
74
+ const data = JSON.parse(body);
75
+ const coll = state.collections.get(name);
76
+ if (!coll) {
77
+ res.writeHead(404);
78
+ res.end();
79
+ return;
80
+ }
81
+ const ids = data.ids ?? [];
82
+ const result = coll
83
+ .filter((p) => ids.includes(p.id))
84
+ .map((p) => ({ id: p.id, payload: p.payload }));
85
+ res.writeHead(200, { 'Content-Type': 'application/json' });
86
+ res.end(JSON.stringify({ result }));
87
+ return;
88
+ }
89
+ // POST /collections/:name/points/delete
90
+ const deleteMatch = url.match(/^\/collections\/([^/]+)\/points\/delete$/);
91
+ if (deleteMatch && req.method === 'POST') {
92
+ const name = deleteMatch[1];
93
+ const data = JSON.parse(body);
94
+ const coll = state.collections.get(name);
95
+ if (!coll) {
96
+ res.writeHead(404);
97
+ res.end();
98
+ return;
99
+ }
100
+ if (data.filter && Object.keys(data.filter).length === 0) {
101
+ coll.length = 0;
102
+ }
103
+ else if (Array.isArray(data.points)) {
104
+ const ids = new Set(data.points);
105
+ state.collections.set(name, coll.filter((p) => !ids.has(p.id)));
106
+ }
107
+ res.writeHead(200, { 'Content-Type': 'application/json' });
108
+ res.end(JSON.stringify({ result: { status: 'completed' } }));
109
+ return;
110
+ }
111
+ // POST /collections/:name/points/search
112
+ const searchMatch = url.match(/^\/collections\/([^/]+)\/points\/search$/);
113
+ if (searchMatch && req.method === 'POST') {
114
+ const name = searchMatch[1];
115
+ const data = JSON.parse(body);
116
+ const coll = state.collections.get(name);
117
+ if (!coll) {
118
+ res.writeHead(404, { 'Content-Type': 'application/json' });
119
+ res.end(JSON.stringify({ status: { error: 'Collection not found' } }));
120
+ return;
121
+ }
122
+ // Simple dot-product scoring
123
+ const results = coll
124
+ .map((p) => {
125
+ let score = 0;
126
+ for (let i = 0; i < data.vector.length; i++) {
127
+ score += (data.vector[i] ?? 0) * (p.vector[i] ?? 0);
128
+ }
129
+ return { score, payload: p.payload };
130
+ })
131
+ .sort((a, b) => b.score - a.score)
132
+ .slice(0, data.limit ?? 10);
133
+ res.writeHead(200, { 'Content-Type': 'application/json' });
134
+ res.end(JSON.stringify({ result: results }));
135
+ return;
136
+ }
137
+ res.writeHead(404);
138
+ res.end('Not found');
139
+ });
140
+ });
141
+ }
142
+ describe('QdrantRag', () => {
143
+ let server;
144
+ let baseUrl;
145
+ let state;
146
+ before(async () => {
147
+ state = { collections: new Map() };
148
+ server = createStubServer(state);
149
+ await new Promise((resolve) => {
150
+ server.listen(0, '127.0.0.1', resolve);
151
+ });
152
+ const addr = server.address();
153
+ if (typeof addr === 'object' && addr) {
154
+ baseUrl = `http://127.0.0.1:${addr.port}`;
155
+ }
156
+ });
157
+ after(async () => {
158
+ await new Promise((resolve, reject) => {
159
+ server.close((err) => (err ? reject(err) : resolve()));
160
+ });
161
+ });
162
+ it('auto-creates collection on first upsert', async () => {
163
+ const rag = new QdrantRag({
164
+ url: baseUrl,
165
+ collectionName: 'test-auto-create',
166
+ embedder: makeEmbedder(),
167
+ });
168
+ assert.ok(!state.collections.has('test-auto-create'));
169
+ const result = await rag.upsert('hello world', {});
170
+ assert.ok(result.ok);
171
+ assert.ok(state.collections.has('test-auto-create'));
172
+ });
173
+ it('upserts and queries documents', async () => {
174
+ state.collections.set('test-query', []);
175
+ const rag = new QdrantRag({
176
+ url: baseUrl,
177
+ collectionName: 'test-query',
178
+ embedder: makeEmbedder(),
179
+ });
180
+ await rag.upsert('ABAP SELECT statement', { namespace: 'docs' });
181
+ await rag.upsert('JavaScript forEach loop', { namespace: 'docs' });
182
+ const embedder = makeEmbedder();
183
+ const result = await rag.query(new QueryEmbedding('ABAP SELECT', embedder), 5);
184
+ assert.ok(result.ok);
185
+ assert.ok(result.value.length > 0);
186
+ assert.ok(result.value[0].text.length > 0);
187
+ assert.ok(result.value[0].score > 0);
188
+ });
189
+ it('healthCheck succeeds when collection exists', async () => {
190
+ state.collections.set('test-health', []);
191
+ const rag = new QdrantRag({
192
+ url: baseUrl,
193
+ collectionName: 'test-health',
194
+ embedder: makeEmbedder(),
195
+ });
196
+ const result = await rag.healthCheck();
197
+ assert.ok(result.ok);
198
+ });
199
+ it('healthCheck fails when collection does not exist', async () => {
200
+ const rag = new QdrantRag({
201
+ url: baseUrl,
202
+ collectionName: 'nonexistent',
203
+ embedder: makeEmbedder(),
204
+ });
205
+ const result = await rag.healthCheck();
206
+ assert.ok(!result.ok);
207
+ assert.equal(result.error.code, 'HEALTH_CHECK_ERROR');
208
+ });
209
+ it('handles connection errors gracefully', async () => {
210
+ const rag = new QdrantRag({
211
+ url: 'http://127.0.0.1:1',
212
+ collectionName: 'unreachable',
213
+ embedder: makeEmbedder(),
214
+ timeoutMs: 1000,
215
+ });
216
+ const result = await rag.healthCheck();
217
+ assert.ok(!result.ok);
218
+ assert.equal(result.error.code, 'HEALTH_CHECK_ERROR');
219
+ });
220
+ it('passes api-key header when configured', async () => {
221
+ state.collections.set('test-auth', []);
222
+ // This just tests that the constructor accepts apiKey without error
223
+ const rag = new QdrantRag({
224
+ url: baseUrl,
225
+ collectionName: 'test-auth',
226
+ embedder: makeEmbedder(),
227
+ apiKey: 'test-secret',
228
+ });
229
+ const result = await rag.healthCheck();
230
+ assert.ok(result.ok);
231
+ });
232
+ it('getById returns the stored record via deterministic UUID', async () => {
233
+ state.collections.set('test-get', []);
234
+ const rag = new QdrantRag({
235
+ url: baseUrl,
236
+ collectionName: 'test-get',
237
+ embedder: makeEmbedder(),
238
+ });
239
+ await rag.upsert('hello', { id: 'r1' });
240
+ const got = await rag.getById?.('r1');
241
+ assert.ok(got.ok);
242
+ assert.ok(got.value);
243
+ assert.equal(got.value?.text, 'hello');
244
+ });
245
+ it('getById returns null for unknown id', async () => {
246
+ state.collections.set('test-get-miss', []);
247
+ const rag = new QdrantRag({
248
+ url: baseUrl,
249
+ collectionName: 'test-get-miss',
250
+ embedder: makeEmbedder(),
251
+ });
252
+ const got = await rag.getById?.('nope');
253
+ assert.ok(got.ok);
254
+ assert.equal(got.value, null);
255
+ });
256
+ it('writer().deleteByIdRaw removes the point', async () => {
257
+ state.collections.set('test-del', []);
258
+ const rag = new QdrantRag({
259
+ url: baseUrl,
260
+ collectionName: 'test-del',
261
+ embedder: makeEmbedder(),
262
+ });
263
+ const w = rag.writer();
264
+ await w.upsertRaw('r1', 'hi', {});
265
+ assert.equal(state.collections.get('test-del')?.length, 1);
266
+ const del = await w.deleteByIdRaw('r1');
267
+ assert.ok(del.ok);
268
+ assert.equal(state.collections.get('test-del')?.length, 0);
269
+ });
270
+ it('writer().clearAll empties the collection', async () => {
271
+ state.collections.set('test-clear', []);
272
+ const rag = new QdrantRag({
273
+ url: baseUrl,
274
+ collectionName: 'test-clear',
275
+ embedder: makeEmbedder(),
276
+ });
277
+ const w = rag.writer();
278
+ await w.upsertRaw('a', 't', {});
279
+ await w.upsertRaw('b', 't', {});
280
+ const cleared = await w.clearAll?.();
281
+ assert.ok(cleared?.ok);
282
+ assert.equal(state.collections.get('test-clear')?.length, 0);
283
+ });
284
+ });
285
+ //# sourceMappingURL=qdrant-rag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-rag.test.js","sourceRoot":"","sources":["../src/qdrant-rag.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@mcp-abap-adt/qdrant-rag",
3
+ "version": "11.0.0",
4
+ "description": "QdrantRag vector store and QdrantRagProvider 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
+ }