@functional-systems/lambdadb 0.3.3 → 0.3.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.
Files changed (58) hide show
  1. package/README.md +52 -9
  2. package/dist/commonjs/client.d.ts +6 -6
  3. package/dist/commonjs/client.js +6 -6
  4. package/dist/commonjs/funcs/collectionsDocsBulkUpsert.d.ts +1 -1
  5. package/dist/commonjs/funcs/collectionsDocsBulkUpsert.js +1 -1
  6. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.d.ts +2 -2
  7. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.d.ts.map +1 -1
  8. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.js +3 -3
  9. package/dist/commonjs/funcs/collectionsDocsGetBulkUpsert.js.map +1 -1
  10. package/dist/commonjs/models/indexconfigsunion.d.ts +76 -4
  11. package/dist/commonjs/models/indexconfigsunion.d.ts.map +1 -1
  12. package/dist/commonjs/models/indexconfigsunion.js +57 -2
  13. package/dist/commonjs/models/indexconfigsunion.js.map +1 -1
  14. package/dist/commonjs/models/operations/querycollection.d.ts +1 -1
  15. package/dist/commonjs/models/operations/updatedocs.d.ts +1 -1
  16. package/dist/commonjs/models/operations/upsertdocs.d.ts +1 -1
  17. package/dist/commonjs/sdk/docs.d.ts +2 -2
  18. package/dist/commonjs/sdk/docs.js +2 -2
  19. package/dist/commonjs/types/errors.d.ts +1 -1
  20. package/dist/commonjs/types/errors.d.ts.map +1 -1
  21. package/dist/commonjs/types/public.d.ts +1 -1
  22. package/dist/commonjs/types/public.d.ts.map +1 -1
  23. package/dist/commonjs/types/public.js.map +1 -1
  24. package/dist/esm/client.d.ts +6 -6
  25. package/dist/esm/client.js +6 -6
  26. package/dist/esm/funcs/collectionsDocsBulkUpsert.d.ts +1 -1
  27. package/dist/esm/funcs/collectionsDocsBulkUpsert.js +1 -1
  28. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.d.ts +2 -2
  29. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.d.ts.map +1 -1
  30. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.js +3 -3
  31. package/dist/esm/funcs/collectionsDocsGetBulkUpsert.js.map +1 -1
  32. package/dist/esm/models/indexconfigsunion.d.ts +76 -4
  33. package/dist/esm/models/indexconfigsunion.d.ts.map +1 -1
  34. package/dist/esm/models/indexconfigsunion.js +52 -1
  35. package/dist/esm/models/indexconfigsunion.js.map +1 -1
  36. package/dist/esm/models/operations/querycollection.d.ts +1 -1
  37. package/dist/esm/models/operations/updatedocs.d.ts +1 -1
  38. package/dist/esm/models/operations/upsertdocs.d.ts +1 -1
  39. package/dist/esm/sdk/docs.d.ts +2 -2
  40. package/dist/esm/sdk/docs.js +2 -2
  41. package/dist/esm/types/errors.d.ts +1 -1
  42. package/dist/esm/types/errors.d.ts.map +1 -1
  43. package/dist/esm/types/public.d.ts +1 -1
  44. package/dist/esm/types/public.d.ts.map +1 -1
  45. package/dist/esm/types/public.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/client.ts +6 -6
  48. package/src/funcs/collectionsDocsBulkUpsert.ts +1 -1
  49. package/src/funcs/collectionsDocsGetBulkUpsert.ts +6 -2
  50. package/src/models/indexconfigsunion.ts +160 -3
  51. package/src/models/operations/querycollection.ts +1 -1
  52. package/src/models/operations/updatedocs.ts +1 -1
  53. package/src/models/operations/upsertdocs.ts +1 -1
  54. package/src/sdk/docs.ts +2 -2
  55. package/src/types/errors.ts +3 -1
  56. package/src/types/public.ts +3 -0
  57. package/test/public-api.test.mjs +279 -0
  58. package/tsconfig.json +1 -2
@@ -5,6 +5,7 @@ import {
5
5
  BadRequestError,
6
6
  HTTPClient,
7
7
  LambdaDBClient,
8
+ SDKValidationError,
8
9
  } from "../dist/esm/index.js";
9
10
 
10
11
  const BASE_URL = "https://api.test";
@@ -83,6 +84,284 @@ test("public client lists collections with project URL, auth header, and Date co
83
84
  assert.equal(result.collections[0].createdAt.toISOString(), "2023-11-14T22:13:20.000Z");
84
85
  });
85
86
 
87
+ test("public client supports managed embedding vector index configs", async () => {
88
+ const managedIndexConfigs = {
89
+ body: {
90
+ type: "text",
91
+ analyzers: ["english"],
92
+ },
93
+ bodyEmbedding: {
94
+ type: "vector",
95
+ managedEmbedding: true,
96
+ embedding: {
97
+ provider: "openai",
98
+ model: "text-embedding-3-small",
99
+ sourceField: "body",
100
+ },
101
+ },
102
+ };
103
+
104
+ const { calls, client } = createClient((call) => {
105
+ assert.equal(call.method, "POST");
106
+ assert.equal(call.url.pathname, "/projects/project-one/collections");
107
+ assert.deepEqual(JSON.parse(call.body), {
108
+ collectionName: "semantic-items",
109
+ indexConfigs: {
110
+ body: {
111
+ type: "text",
112
+ analyzers: ["english"],
113
+ },
114
+ bodyEmbedding: {
115
+ type: "vector",
116
+ managedEmbedding: true,
117
+ embedding: {
118
+ provider: "openai",
119
+ model: "text-embedding-3-small",
120
+ sourceField: "body",
121
+ },
122
+ },
123
+ },
124
+ });
125
+
126
+ return jsonResponse(
127
+ {
128
+ collection: collectionFixture("semantic-items", {
129
+ indexConfigs: {
130
+ ...managedIndexConfigs,
131
+ bodyEmbedding: {
132
+ ...managedIndexConfigs.bodyEmbedding,
133
+ embedding: {
134
+ ...managedIndexConfigs.bodyEmbedding.embedding,
135
+ dimensions: 1536,
136
+ similarity: "cosine",
137
+ },
138
+ },
139
+ },
140
+ }),
141
+ },
142
+ { status: 202 },
143
+ );
144
+ });
145
+
146
+ const result = await client.createCollection({
147
+ collectionName: "semantic-items",
148
+ indexConfigs: managedIndexConfigs,
149
+ });
150
+
151
+ assert.equal(calls.length, 1);
152
+ assert.deepEqual(
153
+ result.collection.indexConfigs.bodyEmbedding.embedding,
154
+ {
155
+ ...managedIndexConfigs.bodyEmbedding.embedding,
156
+ dimensions: 1536,
157
+ similarity: "cosine",
158
+ },
159
+ );
160
+ });
161
+
162
+ test("managed embedding vector config supports optional embedding dimensions and similarity", async () => {
163
+ const { calls, client } = createClient((call) => {
164
+ assert.equal(call.method, "POST");
165
+ assert.deepEqual(JSON.parse(call.body), {
166
+ collectionName: "semantic-items",
167
+ indexConfigs: {
168
+ bodyEmbedding: {
169
+ type: "vector",
170
+ managedEmbedding: true,
171
+ embedding: {
172
+ provider: "openai",
173
+ model: "text-embedding-3-small",
174
+ sourceField: "body",
175
+ dimensions: 1536,
176
+ similarity: "cosine",
177
+ },
178
+ },
179
+ },
180
+ });
181
+
182
+ return jsonResponse(
183
+ {
184
+ collection: collectionFixture("semantic-items", {
185
+ indexConfigs: {
186
+ bodyEmbedding: {
187
+ type: "vector",
188
+ managedEmbedding: true,
189
+ embedding: {
190
+ provider: "openai",
191
+ model: "text-embedding-3-small",
192
+ sourceField: "body",
193
+ dimensions: 1536,
194
+ similarity: "cosine",
195
+ },
196
+ },
197
+ },
198
+ }),
199
+ },
200
+ { status: 202 },
201
+ );
202
+ });
203
+
204
+ const result = await client.createCollection({
205
+ collectionName: "semantic-items",
206
+ indexConfigs: {
207
+ bodyEmbedding: {
208
+ type: "vector",
209
+ managedEmbedding: true,
210
+ embedding: {
211
+ provider: "openai",
212
+ model: "text-embedding-3-small",
213
+ sourceField: "body",
214
+ dimensions: 1536,
215
+ similarity: "cosine",
216
+ },
217
+ },
218
+ },
219
+ });
220
+
221
+ assert.equal(calls.length, 1);
222
+ assert.equal(
223
+ result.collection.indexConfigs.bodyEmbedding.embedding.dimensions,
224
+ 1536,
225
+ );
226
+ });
227
+
228
+ test("managed embedding vector config rejects invalid Java contract shapes", async () => {
229
+ const { calls, client } = createClient(() => {
230
+ throw new Error("request should not be sent for invalid index configs");
231
+ });
232
+
233
+ const invalidIndexConfigs = [
234
+ {
235
+ type: "vector",
236
+ dimensions: 1536,
237
+ embedding: {
238
+ provider: "openai",
239
+ model: "text-embedding-3-small",
240
+ sourceField: "body",
241
+ },
242
+ },
243
+ {
244
+ type: "vector",
245
+ managedEmbedding: false,
246
+ dimensions: 1536,
247
+ embedding: {
248
+ provider: "openai",
249
+ model: "text-embedding-3-small",
250
+ sourceField: "body",
251
+ },
252
+ },
253
+ {
254
+ type: "vector",
255
+ managedEmbedding: true,
256
+ dimensions: 1536,
257
+ embedding: {
258
+ provider: "openai",
259
+ model: "text-embedding-3-small",
260
+ sourceField: "body",
261
+ },
262
+ },
263
+ {
264
+ type: "vector",
265
+ managedEmbedding: true,
266
+ similarity: "cosine",
267
+ embedding: {
268
+ provider: "openai",
269
+ model: "text-embedding-3-small",
270
+ sourceField: "body",
271
+ },
272
+ },
273
+ {
274
+ type: "vector",
275
+ managedEmbedding: true,
276
+ },
277
+ {
278
+ type: "vector",
279
+ managedEmbedding: true,
280
+ embedding: {
281
+ provider: "openai",
282
+ model: "text-embedding-3-small",
283
+ sourceField: "body",
284
+ unsupported: true,
285
+ },
286
+ },
287
+ ];
288
+
289
+ for (const indexConfig of invalidIndexConfigs) {
290
+ const result = await client.createCollectionSafe({
291
+ collectionName: "invalid-vector",
292
+ indexConfigs: { bodyEmbedding: indexConfig },
293
+ });
294
+
295
+ assert.equal(result.ok, false);
296
+ assert.ok(result.error instanceof SDKValidationError);
297
+ }
298
+
299
+ assert.equal(calls.length, 0);
300
+ });
301
+
302
+ test("collection query supports managed embedding queryText KNN payloads", async () => {
303
+ const { calls, client } = createClient((call) => {
304
+ assert.equal(call.method, "POST");
305
+ assert.equal(call.url.pathname, "/projects/project-one/collections/items/query");
306
+ assert.deepEqual(JSON.parse(call.body), {
307
+ size: 10,
308
+ query: {
309
+ knn: {
310
+ field: "bodyEmbedding",
311
+ queryText: "refund policy",
312
+ k: 10,
313
+ },
314
+ },
315
+ consistentRead: false,
316
+ includeVectors: false,
317
+ });
318
+
319
+ return jsonResponse({
320
+ took: 3,
321
+ maxScore: 0.98,
322
+ total: 1,
323
+ docs: [{ collection: "items", score: 0.98, doc: { id: "a" } }],
324
+ isDocsInline: true,
325
+ docsUrl: null,
326
+ });
327
+ });
328
+
329
+ const result = await client.collection("items").query({
330
+ size: 10,
331
+ query: {
332
+ knn: {
333
+ field: "bodyEmbedding",
334
+ queryText: "refund policy",
335
+ k: 10,
336
+ },
337
+ },
338
+ });
339
+
340
+ assert.equal(calls.length, 1);
341
+ assert.equal(result.total, 1);
342
+ });
343
+
344
+ test("getBulkUpsertSafe exposes managed embedding unsupported bad requests", async () => {
345
+ const { client } = createClient((call) => {
346
+ assert.equal(call.method, "GET");
347
+ assert.equal(call.url.pathname, "/projects/project-one/collections/items/docs/bulk-upsert");
348
+
349
+ return jsonResponse(
350
+ { message: "Bulk upsert is not supported for collections with managed embedding fields" },
351
+ { status: 400 },
352
+ );
353
+ });
354
+
355
+ const result = await client.collection("items").docs.getBulkUpsertSafe();
356
+
357
+ assert.equal(result.ok, false);
358
+ assert.ok(result.error instanceof BadRequestError);
359
+ assert.equal(
360
+ result.error.data$.message,
361
+ "Bulk upsert is not supported for collections with managed embedding fields",
362
+ );
363
+ });
364
+
86
365
  test("public pagination helpers collect all collection pages", async () => {
87
366
  const { calls, client } = createClient((call, index) => {
88
367
  if (index === 0) {
package/tsconfig.json CHANGED
@@ -14,9 +14,8 @@
14
14
  "declarationMap": true,
15
15
  "sourceMap": true,
16
16
  "outDir": ".",
17
-
17
+ "rootDir": "src",
18
18
 
19
- // https://github.com/tsconfig/bases/blob/a1bf7c0fa2e094b068ca3e1448ca2ece4157977e/bases/strictest.json
20
19
  "strict": true,
21
20
  "allowUnusedLabels": false,
22
21
  "allowUnreachableCode": false,