@mhalder/qdrant-mcp-server 1.1.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.
Files changed (100) hide show
  1. package/.env.example +92 -0
  2. package/.github/workflows/ci.yml +61 -0
  3. package/.github/workflows/claude-code-review.yml +57 -0
  4. package/.github/workflows/claude.yml +50 -0
  5. package/.github/workflows/release.yml +52 -0
  6. package/.husky/commit-msg +1 -0
  7. package/.husky/pre-commit +1 -0
  8. package/.releaserc.json +59 -0
  9. package/.yamlfmt +4 -0
  10. package/CHANGELOG.md +73 -0
  11. package/CONTRIBUTING.md +176 -0
  12. package/LICENSE +21 -0
  13. package/README.md +714 -0
  14. package/build/embeddings/base.d.ts +23 -0
  15. package/build/embeddings/base.d.ts.map +1 -0
  16. package/build/embeddings/base.js +2 -0
  17. package/build/embeddings/base.js.map +1 -0
  18. package/build/embeddings/cohere.d.ts +17 -0
  19. package/build/embeddings/cohere.d.ts.map +1 -0
  20. package/build/embeddings/cohere.js +102 -0
  21. package/build/embeddings/cohere.js.map +1 -0
  22. package/build/embeddings/cohere.test.d.ts +2 -0
  23. package/build/embeddings/cohere.test.d.ts.map +1 -0
  24. package/build/embeddings/cohere.test.js +279 -0
  25. package/build/embeddings/cohere.test.js.map +1 -0
  26. package/build/embeddings/factory.d.ts +10 -0
  27. package/build/embeddings/factory.d.ts.map +1 -0
  28. package/build/embeddings/factory.js +98 -0
  29. package/build/embeddings/factory.js.map +1 -0
  30. package/build/embeddings/factory.test.d.ts +2 -0
  31. package/build/embeddings/factory.test.d.ts.map +1 -0
  32. package/build/embeddings/factory.test.js +329 -0
  33. package/build/embeddings/factory.test.js.map +1 -0
  34. package/build/embeddings/ollama.d.ts +18 -0
  35. package/build/embeddings/ollama.d.ts.map +1 -0
  36. package/build/embeddings/ollama.js +135 -0
  37. package/build/embeddings/ollama.js.map +1 -0
  38. package/build/embeddings/ollama.test.d.ts +2 -0
  39. package/build/embeddings/ollama.test.d.ts.map +1 -0
  40. package/build/embeddings/ollama.test.js +399 -0
  41. package/build/embeddings/ollama.test.js.map +1 -0
  42. package/build/embeddings/openai.d.ts +16 -0
  43. package/build/embeddings/openai.d.ts.map +1 -0
  44. package/build/embeddings/openai.js +108 -0
  45. package/build/embeddings/openai.js.map +1 -0
  46. package/build/embeddings/openai.test.d.ts +2 -0
  47. package/build/embeddings/openai.test.d.ts.map +1 -0
  48. package/build/embeddings/openai.test.js +283 -0
  49. package/build/embeddings/openai.test.js.map +1 -0
  50. package/build/embeddings/voyage.d.ts +19 -0
  51. package/build/embeddings/voyage.d.ts.map +1 -0
  52. package/build/embeddings/voyage.js +113 -0
  53. package/build/embeddings/voyage.js.map +1 -0
  54. package/build/embeddings/voyage.test.d.ts +2 -0
  55. package/build/embeddings/voyage.test.d.ts.map +1 -0
  56. package/build/embeddings/voyage.test.js +371 -0
  57. package/build/embeddings/voyage.test.js.map +1 -0
  58. package/build/index.d.ts +3 -0
  59. package/build/index.d.ts.map +1 -0
  60. package/build/index.js +534 -0
  61. package/build/index.js.map +1 -0
  62. package/build/index.test.d.ts +2 -0
  63. package/build/index.test.d.ts.map +1 -0
  64. package/build/index.test.js +241 -0
  65. package/build/index.test.js.map +1 -0
  66. package/build/qdrant/client.d.ts +37 -0
  67. package/build/qdrant/client.d.ts.map +1 -0
  68. package/build/qdrant/client.js +142 -0
  69. package/build/qdrant/client.js.map +1 -0
  70. package/build/qdrant/client.test.d.ts +2 -0
  71. package/build/qdrant/client.test.d.ts.map +1 -0
  72. package/build/qdrant/client.test.js +340 -0
  73. package/build/qdrant/client.test.js.map +1 -0
  74. package/commitlint.config.js +25 -0
  75. package/docker-compose.yml +22 -0
  76. package/docs/test_report.md +259 -0
  77. package/examples/README.md +315 -0
  78. package/examples/basic/README.md +111 -0
  79. package/examples/filters/README.md +262 -0
  80. package/examples/knowledge-base/README.md +207 -0
  81. package/examples/rate-limiting/README.md +376 -0
  82. package/package.json +59 -0
  83. package/scripts/verify-providers.js +238 -0
  84. package/src/embeddings/base.ts +25 -0
  85. package/src/embeddings/cohere.test.ts +408 -0
  86. package/src/embeddings/cohere.ts +152 -0
  87. package/src/embeddings/factory.test.ts +453 -0
  88. package/src/embeddings/factory.ts +163 -0
  89. package/src/embeddings/ollama.test.ts +543 -0
  90. package/src/embeddings/ollama.ts +196 -0
  91. package/src/embeddings/openai.test.ts +402 -0
  92. package/src/embeddings/openai.ts +158 -0
  93. package/src/embeddings/voyage.test.ts +520 -0
  94. package/src/embeddings/voyage.ts +168 -0
  95. package/src/index.test.ts +304 -0
  96. package/src/index.ts +614 -0
  97. package/src/qdrant/client.test.ts +456 -0
  98. package/src/qdrant/client.ts +195 -0
  99. package/tsconfig.json +19 -0
  100. package/vitest.config.ts +37 -0
@@ -0,0 +1,241 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ vi.mock('./qdrant/client.js');
3
+ vi.mock('./embeddings/openai.js');
4
+ describe('MCP Server Tool Schemas', () => {
5
+ describe('CreateCollectionSchema', () => {
6
+ it('should validate correct collection creation input', async () => {
7
+ const { z } = await import('zod');
8
+ const CreateCollectionSchema = z.object({
9
+ name: z.string(),
10
+ distance: z.enum(['Cosine', 'Euclid', 'Dot']).optional(),
11
+ });
12
+ const validInput = { name: 'test-collection' };
13
+ expect(() => CreateCollectionSchema.parse(validInput)).not.toThrow();
14
+ const validInputWithDistance = { name: 'test-collection', distance: 'Cosine' };
15
+ expect(() => CreateCollectionSchema.parse(validInputWithDistance)).not.toThrow();
16
+ });
17
+ it('should reject invalid distance metric', async () => {
18
+ const { z } = await import('zod');
19
+ const CreateCollectionSchema = z.object({
20
+ name: z.string(),
21
+ distance: z.enum(['Cosine', 'Euclid', 'Dot']).optional(),
22
+ });
23
+ const invalidInput = { name: 'test', distance: 'Invalid' };
24
+ expect(() => CreateCollectionSchema.parse(invalidInput)).toThrow();
25
+ });
26
+ it('should require name field', async () => {
27
+ const { z } = await import('zod');
28
+ const CreateCollectionSchema = z.object({
29
+ name: z.string(),
30
+ distance: z.enum(['Cosine', 'Euclid', 'Dot']).optional(),
31
+ });
32
+ const invalidInput = { distance: 'Cosine' };
33
+ expect(() => CreateCollectionSchema.parse(invalidInput)).toThrow();
34
+ });
35
+ });
36
+ describe('AddDocumentsSchema', () => {
37
+ it('should validate correct document addition input', async () => {
38
+ const { z } = await import('zod');
39
+ const AddDocumentsSchema = z.object({
40
+ collection: z.string(),
41
+ documents: z.array(z.object({
42
+ id: z.union([z.string(), z.number()]),
43
+ text: z.string(),
44
+ metadata: z.record(z.any()).optional(),
45
+ })),
46
+ });
47
+ const validInput = {
48
+ collection: 'test-collection',
49
+ documents: [
50
+ { id: 1, text: 'test document' },
51
+ { id: 'doc-2', text: 'another document', metadata: { type: 'test' } },
52
+ ],
53
+ };
54
+ expect(() => AddDocumentsSchema.parse(validInput)).not.toThrow();
55
+ });
56
+ it('should accept both string and number IDs', async () => {
57
+ const { z } = await import('zod');
58
+ const AddDocumentsSchema = z.object({
59
+ collection: z.string(),
60
+ documents: z.array(z.object({
61
+ id: z.union([z.string(), z.number()]),
62
+ text: z.string(),
63
+ metadata: z.record(z.any()).optional(),
64
+ })),
65
+ });
66
+ const stringIdInput = {
67
+ collection: 'test',
68
+ documents: [{ id: 'string-id', text: 'test' }],
69
+ };
70
+ expect(() => AddDocumentsSchema.parse(stringIdInput)).not.toThrow();
71
+ const numberIdInput = {
72
+ collection: 'test',
73
+ documents: [{ id: 123, text: 'test' }],
74
+ };
75
+ expect(() => AddDocumentsSchema.parse(numberIdInput)).not.toThrow();
76
+ });
77
+ it('should require text field in documents', async () => {
78
+ const { z } = await import('zod');
79
+ const AddDocumentsSchema = z.object({
80
+ collection: z.string(),
81
+ documents: z.array(z.object({
82
+ id: z.union([z.string(), z.number()]),
83
+ text: z.string(),
84
+ metadata: z.record(z.any()).optional(),
85
+ })),
86
+ });
87
+ const invalidInput = {
88
+ collection: 'test',
89
+ documents: [{ id: 1, metadata: {} }],
90
+ };
91
+ expect(() => AddDocumentsSchema.parse(invalidInput)).toThrow();
92
+ });
93
+ });
94
+ describe('SemanticSearchSchema', () => {
95
+ it('should validate correct search input', async () => {
96
+ const { z } = await import('zod');
97
+ const SemanticSearchSchema = z.object({
98
+ collection: z.string(),
99
+ query: z.string(),
100
+ limit: z.number().optional(),
101
+ filter: z.record(z.any()).optional(),
102
+ });
103
+ const validInput = {
104
+ collection: 'test-collection',
105
+ query: 'search query',
106
+ limit: 10,
107
+ filter: { category: 'test' },
108
+ };
109
+ expect(() => SemanticSearchSchema.parse(validInput)).not.toThrow();
110
+ });
111
+ it('should work with minimal input', async () => {
112
+ const { z } = await import('zod');
113
+ const SemanticSearchSchema = z.object({
114
+ collection: z.string(),
115
+ query: z.string(),
116
+ limit: z.number().optional(),
117
+ filter: z.record(z.any()).optional(),
118
+ });
119
+ const minimalInput = {
120
+ collection: 'test',
121
+ query: 'search',
122
+ };
123
+ expect(() => SemanticSearchSchema.parse(minimalInput)).not.toThrow();
124
+ });
125
+ it('should require collection and query', async () => {
126
+ const { z } = await import('zod');
127
+ const SemanticSearchSchema = z.object({
128
+ collection: z.string(),
129
+ query: z.string(),
130
+ limit: z.number().optional(),
131
+ filter: z.record(z.any()).optional(),
132
+ });
133
+ const missingQuery = { collection: 'test', limit: 5 };
134
+ expect(() => SemanticSearchSchema.parse(missingQuery)).toThrow();
135
+ const missingCollection = { query: 'test', limit: 5 };
136
+ expect(() => SemanticSearchSchema.parse(missingCollection)).toThrow();
137
+ });
138
+ });
139
+ describe('DeleteCollectionSchema', () => {
140
+ it('should validate correct delete input', async () => {
141
+ const { z } = await import('zod');
142
+ const DeleteCollectionSchema = z.object({
143
+ name: z.string(),
144
+ });
145
+ const validInput = { name: 'test-collection' };
146
+ expect(() => DeleteCollectionSchema.parse(validInput)).not.toThrow();
147
+ });
148
+ it('should require name field', async () => {
149
+ const { z } = await import('zod');
150
+ const DeleteCollectionSchema = z.object({
151
+ name: z.string(),
152
+ });
153
+ expect(() => DeleteCollectionSchema.parse({})).toThrow();
154
+ });
155
+ });
156
+ describe('GetCollectionInfoSchema', () => {
157
+ it('should validate correct input', async () => {
158
+ const { z } = await import('zod');
159
+ const GetCollectionInfoSchema = z.object({
160
+ name: z.string(),
161
+ });
162
+ const validInput = { name: 'test-collection' };
163
+ expect(() => GetCollectionInfoSchema.parse(validInput)).not.toThrow();
164
+ });
165
+ });
166
+ describe('DeleteDocumentsSchema', () => {
167
+ it('should validate correct delete documents input', async () => {
168
+ const { z } = await import('zod');
169
+ const DeleteDocumentsSchema = z.object({
170
+ collection: z.string(),
171
+ ids: z.array(z.union([z.string(), z.number()])),
172
+ });
173
+ const validInput = {
174
+ collection: 'test-collection',
175
+ ids: [1, 'doc-2', 3],
176
+ };
177
+ expect(() => DeleteDocumentsSchema.parse(validInput)).not.toThrow();
178
+ });
179
+ it('should accept string and number IDs', async () => {
180
+ const { z } = await import('zod');
181
+ const DeleteDocumentsSchema = z.object({
182
+ collection: z.string(),
183
+ ids: z.array(z.union([z.string(), z.number()])),
184
+ });
185
+ const stringIds = { collection: 'test', ids: ['a', 'b', 'c'] };
186
+ expect(() => DeleteDocumentsSchema.parse(stringIds)).not.toThrow();
187
+ const numberIds = { collection: 'test', ids: [1, 2, 3] };
188
+ expect(() => DeleteDocumentsSchema.parse(numberIds)).not.toThrow();
189
+ const mixedIds = { collection: 'test', ids: [1, 'b', 3] };
190
+ expect(() => DeleteDocumentsSchema.parse(mixedIds)).not.toThrow();
191
+ });
192
+ it('should require both collection and ids', async () => {
193
+ const { z } = await import('zod');
194
+ const DeleteDocumentsSchema = z.object({
195
+ collection: z.string(),
196
+ ids: z.array(z.union([z.string(), z.number()])),
197
+ });
198
+ const missingIds = { collection: 'test' };
199
+ expect(() => DeleteDocumentsSchema.parse(missingIds)).toThrow();
200
+ const missingCollection = { ids: [1, 2, 3] };
201
+ expect(() => DeleteDocumentsSchema.parse(missingCollection)).toThrow();
202
+ });
203
+ });
204
+ });
205
+ describe('MCP Server Resource URIs', () => {
206
+ it('should match collections URI pattern', () => {
207
+ const collectionsUri = 'qdrant://collections';
208
+ expect(collectionsUri).toMatch(/^qdrant:\/\/collections$/);
209
+ });
210
+ it('should match collection detail URI pattern', () => {
211
+ const collectionUri = 'qdrant://collection/my-collection';
212
+ const match = collectionUri.match(/^qdrant:\/\/collection\/(.+)$/);
213
+ expect(match).not.toBeNull();
214
+ expect(match[1]).toBe('my-collection');
215
+ });
216
+ it('should extract collection name from URI', () => {
217
+ const testCases = [
218
+ { uri: 'qdrant://collection/test', expected: 'test' },
219
+ { uri: 'qdrant://collection/my-docs', expected: 'my-docs' },
220
+ { uri: 'qdrant://collection/collection-123', expected: 'collection-123' },
221
+ ];
222
+ testCases.forEach(({ uri, expected }) => {
223
+ const match = uri.match(/^qdrant:\/\/collection\/(.+)$/);
224
+ expect(match[1]).toBe(expected);
225
+ });
226
+ });
227
+ it('should not match invalid URIs', () => {
228
+ const invalidUris = [
229
+ 'qdrant://invalid',
230
+ 'http://collections',
231
+ 'qdrant://collection/',
232
+ 'qdrant:collections',
233
+ ];
234
+ invalidUris.forEach((uri) => {
235
+ const collectionsMatch = uri.match(/^qdrant:\/\/collections$/);
236
+ const collectionMatch = uri.match(/^qdrant:\/\/collection\/(.+)$/);
237
+ expect(collectionsMatch || collectionMatch).toBeFalsy();
238
+ });
239
+ });
240
+ });
241
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAc,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC9B,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAElC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;aACzD,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAErE,MAAM,sBAAsB,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAiB,EAAE,CAAC;YACxF,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;aACzD,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;aACzD,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;gBAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC1B,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;oBACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACvC,CAAC,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,SAAS,EAAE;oBACT,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE;oBAChC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;iBACtE;aACF,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;gBAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC1B,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;oBACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACvC,CAAC,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG;gBACpB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAC/C,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEpE,MAAM,aAAa,GAAG;gBACpB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACvC,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;gBAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC1B,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;oBACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;iBACvC,CAAC,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG;gBACnB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;aACrC,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;aACrC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;aAC7B,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;aACrC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG;gBACnB,UAAU,EAAE,MAAM;gBAClB,KAAK,EAAE,QAAQ;aAChB,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;aACrC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAEjE,MAAM,iBAAiB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;aACjB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;aACjB,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;aACjB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aAChD,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;aACrB,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aAChD,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEnE,MAAM,SAAS,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEnE,MAAM,QAAQ,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;gBACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aAChD,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAEhE,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,cAAc,GAAG,sBAAsB,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,aAAa,GAAG,mCAAmC,CAAC;QAC1D,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAEnE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,SAAS,GAAG;YAChB,EAAE,GAAG,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,EAAE;YACrD,EAAE,GAAG,EAAE,6BAA6B,EAAE,QAAQ,EAAE,SAAS,EAAE;YAC3D,EAAE,GAAG,EAAE,oCAAoC,EAAE,QAAQ,EAAE,gBAAgB,EAAE;SAC1E,CAAC;QAEF,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACzD,MAAM,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,WAAW,GAAG;YAClB,kBAAkB;YAClB,oBAAoB;YACpB,sBAAsB;YACtB,oBAAoB;SACrB,CAAC;QAEF,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAEnE,MAAM,CAAC,gBAAgB,IAAI,eAAe,CAAC,CAAC,SAAS,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface CollectionInfo {
2
+ name: string;
3
+ vectorSize: number;
4
+ pointsCount: number;
5
+ distance: 'Cosine' | 'Euclid' | 'Dot';
6
+ }
7
+ export interface SearchResult {
8
+ id: string | number;
9
+ score: number;
10
+ payload?: Record<string, any>;
11
+ }
12
+ export declare class QdrantManager {
13
+ private client;
14
+ constructor(url?: string);
15
+ /**
16
+ * Converts a string ID to UUID format if it's not already a UUID.
17
+ * Qdrant requires string IDs to be in UUID format.
18
+ */
19
+ private normalizeId;
20
+ createCollection(name: string, vectorSize: number, distance?: 'Cosine' | 'Euclid' | 'Dot'): Promise<void>;
21
+ collectionExists(name: string): Promise<boolean>;
22
+ listCollections(): Promise<string[]>;
23
+ getCollectionInfo(name: string): Promise<CollectionInfo>;
24
+ deleteCollection(name: string): Promise<void>;
25
+ addPoints(collectionName: string, points: Array<{
26
+ id: string | number;
27
+ vector: number[];
28
+ payload?: Record<string, any>;
29
+ }>): Promise<void>;
30
+ search(collectionName: string, vector: number[], limit?: number, filter?: Record<string, any>): Promise<SearchResult[]>;
31
+ getPoint(collectionName: string, id: string | number): Promise<{
32
+ id: string | number;
33
+ payload?: Record<string, any>;
34
+ } | null>;
35
+ deletePoints(collectionName: string, ids: (string | number)[]): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/qdrant/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;gBAEjB,GAAG,GAAE,MAAgC;IAIjD;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBb,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,QAAQ,GAAG,QAAQ,GAAG,KAAgB,GAC/C,OAAO,CAAC,IAAI,CAAC;IASV,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKpC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAqBxD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAC,GACD,OAAO,CAAC,IAAI,CAAC;IAkBV,MAAM,CACV,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC;IAkCpB,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,GAAG,MAAM,GAClB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAoBnE,YAAY,CAChB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;CASjB"}
@@ -0,0 +1,142 @@
1
+ import { QdrantClient } from '@qdrant/js-client-rest';
2
+ import { createHash } from 'crypto';
3
+ export class QdrantManager {
4
+ client;
5
+ constructor(url = 'http://localhost:6333') {
6
+ this.client = new QdrantClient({ url });
7
+ }
8
+ /**
9
+ * Converts a string ID to UUID format if it's not already a UUID.
10
+ * Qdrant requires string IDs to be in UUID format.
11
+ */
12
+ normalizeId(id) {
13
+ if (typeof id === 'number') {
14
+ return id;
15
+ }
16
+ // Check if already a valid UUID (8-4-4-4-12 format)
17
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
+ if (uuidRegex.test(id)) {
19
+ return id;
20
+ }
21
+ // Convert arbitrary string to deterministic UUID v5-like format
22
+ const hash = createHash('sha256').update(id).digest('hex');
23
+ return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
24
+ }
25
+ async createCollection(name, vectorSize, distance = 'Cosine') {
26
+ await this.client.createCollection(name, {
27
+ vectors: {
28
+ size: vectorSize,
29
+ distance,
30
+ },
31
+ });
32
+ }
33
+ async collectionExists(name) {
34
+ try {
35
+ await this.client.getCollection(name);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ async listCollections() {
43
+ const response = await this.client.getCollections();
44
+ return response.collections.map((c) => c.name);
45
+ }
46
+ async getCollectionInfo(name) {
47
+ const info = await this.client.getCollection(name);
48
+ const vectorConfig = info.config.params.vectors;
49
+ // Handle both named and unnamed vector configurations
50
+ let size = 0;
51
+ let distance = 'Cosine';
52
+ if (typeof vectorConfig === 'object' && vectorConfig !== null && 'size' in vectorConfig) {
53
+ size = typeof vectorConfig.size === 'number' ? vectorConfig.size : 0;
54
+ distance = vectorConfig.distance;
55
+ }
56
+ return {
57
+ name,
58
+ vectorSize: size,
59
+ pointsCount: info.points_count || 0,
60
+ distance,
61
+ };
62
+ }
63
+ async deleteCollection(name) {
64
+ await this.client.deleteCollection(name);
65
+ }
66
+ async addPoints(collectionName, points) {
67
+ try {
68
+ // Normalize all IDs to ensure string IDs are in UUID format
69
+ const normalizedPoints = points.map(point => ({
70
+ ...point,
71
+ id: this.normalizeId(point.id),
72
+ }));
73
+ await this.client.upsert(collectionName, {
74
+ wait: true,
75
+ points: normalizedPoints,
76
+ });
77
+ }
78
+ catch (error) {
79
+ const errorMessage = error?.data?.status?.error || error?.message || String(error);
80
+ throw new Error(`Failed to add points to collection "${collectionName}": ${errorMessage}`);
81
+ }
82
+ }
83
+ async search(collectionName, vector, limit = 5, filter) {
84
+ // Convert simple key-value filter to Qdrant filter format
85
+ // Accepts either:
86
+ // 1. Simple format: {"category": "database"}
87
+ // 2. Qdrant format: {must: [{key: "category", match: {value: "database"}}]}
88
+ let qdrantFilter;
89
+ if (filter && Object.keys(filter).length > 0) {
90
+ // Check if already in Qdrant format (has must/should/must_not keys)
91
+ if (filter.must || filter.should || filter.must_not) {
92
+ qdrantFilter = filter;
93
+ }
94
+ else {
95
+ // Convert simple key-value format to Qdrant format
96
+ qdrantFilter = {
97
+ must: Object.entries(filter).map(([key, value]) => ({
98
+ key,
99
+ match: { value },
100
+ })),
101
+ };
102
+ }
103
+ }
104
+ const results = await this.client.search(collectionName, {
105
+ vector,
106
+ limit,
107
+ filter: qdrantFilter,
108
+ });
109
+ return results.map((result) => ({
110
+ id: result.id,
111
+ score: result.score,
112
+ payload: result.payload || undefined,
113
+ }));
114
+ }
115
+ async getPoint(collectionName, id) {
116
+ try {
117
+ const normalizedId = this.normalizeId(id);
118
+ const points = await this.client.retrieve(collectionName, {
119
+ ids: [normalizedId],
120
+ });
121
+ if (points.length === 0) {
122
+ return null;
123
+ }
124
+ return {
125
+ id: points[0].id,
126
+ payload: points[0].payload || undefined,
127
+ };
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ async deletePoints(collectionName, ids) {
134
+ // Normalize IDs to ensure string IDs are in UUID format
135
+ const normalizedIds = ids.map(id => this.normalizeId(id));
136
+ await this.client.delete(collectionName, {
137
+ wait: true,
138
+ points: normalizedIds,
139
+ });
140
+ }
141
+ }
142
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/qdrant/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAepC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAe;IAE7B,YAAY,MAAc,uBAAuB;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,EAAmB;QACrC,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,oDAAoD;QACpD,MAAM,SAAS,GAAG,iEAAiE,CAAC;QACpF,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,gEAAgE;QAChE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACtH,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,UAAkB,EAClB,WAAwC,QAAQ;QAEhD,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE;gBACP,IAAI,EAAE,UAAU;gBAChB,QAAQ;aACT;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACpD,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAEhD,sDAAsD;QACtD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,QAAQ,GAAgC,QAAQ,CAAC;QAErD,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;YACxF,IAAI,GAAG,OAAO,YAAY,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,QAAQ,GAAG,YAAY,CAAC,QAAuC,CAAC;QAClE,CAAC;QAED,OAAO;YACL,IAAI;YACJ,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC;YACnC,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,SAAS,CACb,cAAsB,EACtB,MAIE;QAEF,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5C,GAAG,KAAK;gBACR,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC,CAAC;YAEJ,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE;gBACvC,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,uCAAuC,cAAc,MAAM,YAAY,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,cAAsB,EACtB,MAAgB,EAChB,QAAgB,CAAC,EACjB,MAA4B;QAE5B,0DAA0D;QAC1D,kBAAkB;QAClB,6CAA6C;QAC7C,4EAA4E;QAC5E,IAAI,YAAY,CAAC;QACjB,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,oEAAoE;YACpE,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpD,YAAY,GAAG,MAAM,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,YAAY,GAAG;oBACb,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;wBAClD,GAAG;wBACH,KAAK,EAAE,EAAE,KAAK,EAAE;qBACjB,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE;YACvD,MAAM;YACN,KAAK;YACL,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;SACrC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,cAAsB,EACtB,EAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;gBACxD,GAAG,EAAE,CAAC,YAAY,CAAC;aACpB,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBAChB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,SAAS;aACxC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,cAAsB,EACtB,GAAwB;QAExB,wDAAwD;QACxD,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE;YACvC,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../src/qdrant/client.test.ts"],"names":[],"mappings":""}