vectra 0.12.2 → 0.14.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/LICENSE +1 -1
- package/README.md +92 -100
- package/bin/vectra.js +3 -0
- package/lib/BrowserWebFetcher.d.ts +75 -0
- package/lib/BrowserWebFetcher.d.ts.map +1 -0
- package/lib/BrowserWebFetcher.js +290 -0
- package/lib/BrowserWebFetcher.js.map +1 -0
- package/lib/FileFetcher.d.ts +5 -0
- package/lib/FileFetcher.d.ts.map +1 -0
- package/lib/FileFetcher.js +89 -0
- package/lib/FileFetcher.js.map +1 -0
- package/lib/FileFetcher.spec.d.ts +2 -0
- package/lib/FileFetcher.spec.d.ts.map +1 -0
- package/lib/FileFetcher.spec.js +244 -0
- package/lib/FileFetcher.spec.js.map +1 -0
- package/lib/FolderWatcher.d.ts +91 -0
- package/lib/FolderWatcher.d.ts.map +1 -0
- package/lib/FolderWatcher.js +304 -0
- package/lib/FolderWatcher.js.map +1 -0
- package/lib/FolderWatcher.spec.d.ts +2 -0
- package/lib/FolderWatcher.spec.d.ts.map +1 -0
- package/lib/FolderWatcher.spec.js +308 -0
- package/lib/FolderWatcher.spec.js.map +1 -0
- package/lib/GPT3Tokenizer.d.ts +9 -0
- package/lib/GPT3Tokenizer.spec.d.ts +2 -0
- package/lib/GPT3Tokenizer.spec.d.ts.map +1 -0
- package/lib/GPT3Tokenizer.spec.js +45 -0
- package/lib/GPT3Tokenizer.spec.js.map +1 -0
- package/lib/ItemSelector.d.ts +41 -0
- package/lib/ItemSelector.d.ts.map +1 -0
- package/lib/ItemSelector.js +179 -0
- package/lib/ItemSelector.js.map +1 -0
- package/lib/ItemSelector.spec.d.ts +2 -0
- package/lib/ItemSelector.spec.d.ts.map +1 -0
- package/lib/ItemSelector.spec.js +204 -0
- package/lib/ItemSelector.spec.js.map +1 -0
- package/lib/LocalDocument.d.ts +54 -0
- package/lib/LocalDocument.d.ts.map +1 -1
- package/lib/LocalDocument.js +116 -0
- package/lib/LocalDocument.js.map +1 -0
- package/lib/LocalDocument.spec.d.ts +2 -0
- package/lib/LocalDocument.spec.d.ts.map +1 -0
- package/lib/LocalDocument.spec.js +214 -0
- package/lib/LocalDocument.spec.js.map +1 -0
- package/lib/LocalDocumentIndex.d.ts +152 -0
- package/lib/LocalDocumentIndex.d.ts.map +1 -1
- package/lib/LocalDocumentIndex.js +420 -0
- package/lib/LocalDocumentIndex.js.map +1 -0
- package/lib/LocalDocumentIndex.spec.d.ts +2 -0
- package/lib/LocalDocumentIndex.spec.d.ts.map +1 -0
- package/lib/LocalDocumentIndex.spec.js +494 -0
- package/lib/LocalDocumentIndex.spec.js.map +1 -0
- package/lib/LocalDocumentResult.d.ts +66 -0
- package/lib/LocalDocumentResult.d.ts.map +1 -1
- package/lib/LocalDocumentResult.js +376 -0
- package/lib/LocalDocumentResult.js.map +1 -0
- package/lib/LocalDocumentResult.spec.d.ts +2 -0
- package/lib/LocalDocumentResult.spec.d.ts.map +1 -0
- package/lib/LocalDocumentResult.spec.js +373 -0
- package/lib/LocalDocumentResult.spec.js.map +1 -0
- package/lib/LocalEmbeddings.d.ts +59 -0
- package/lib/LocalEmbeddings.d.ts.map +1 -0
- package/lib/LocalEmbeddings.js +101 -0
- package/lib/LocalEmbeddings.js.map +1 -0
- package/lib/LocalEmbeddings.spec.d.ts +2 -0
- package/lib/LocalEmbeddings.spec.d.ts.map +1 -0
- package/lib/LocalEmbeddings.spec.js +155 -0
- package/lib/LocalEmbeddings.spec.js.map +1 -0
- package/lib/LocalIndex.d.ts +159 -0
- package/lib/LocalIndex.d.ts.map +1 -1
- package/lib/LocalIndex.js +519 -0
- package/lib/LocalIndex.js.map +1 -0
- package/lib/LocalIndex.spec.d.ts +2 -0
- package/lib/LocalIndex.spec.js +611 -9
- package/lib/LocalIndex.spec.js.map +1 -1
- package/lib/OpenAIEmbeddings.d.ts +124 -0
- package/lib/OpenAIEmbeddings.d.ts.map +1 -0
- package/lib/OpenAIEmbeddings.js +166 -0
- package/lib/OpenAIEmbeddings.js.map +1 -0
- package/lib/OpenAIEmbeddings.spec.d.ts +2 -0
- package/lib/OpenAIEmbeddings.spec.d.ts.map +1 -0
- package/lib/OpenAIEmbeddings.spec.js +298 -0
- package/lib/OpenAIEmbeddings.spec.js.map +1 -0
- package/lib/TextSplitter.d.ts +21 -0
- package/lib/TextSplitter.d.ts.map +1 -1
- package/lib/TextSplitter.js +500 -0
- package/lib/TextSplitter.js.map +1 -0
- package/lib/TextSplitter.spec.d.ts +2 -0
- package/lib/TextSplitter.spec.d.ts.map +1 -0
- package/lib/TextSplitter.spec.js +337 -0
- package/lib/TextSplitter.spec.js.map +1 -0
- package/lib/TransformersEmbeddings.d.ts +121 -0
- package/lib/TransformersEmbeddings.d.ts.map +1 -0
- package/lib/TransformersEmbeddings.js +176 -0
- package/lib/TransformersEmbeddings.js.map +1 -0
- package/lib/TransformersEmbeddings.spec.d.ts +2 -0
- package/lib/TransformersEmbeddings.spec.d.ts.map +1 -0
- package/lib/TransformersEmbeddings.spec.js +198 -0
- package/lib/TransformersEmbeddings.spec.js.map +1 -0
- package/lib/TransformersTokenizer.d.ts +33 -0
- package/lib/TransformersTokenizer.d.ts.map +1 -0
- package/lib/TransformersTokenizer.js +44 -0
- package/lib/TransformersTokenizer.js.map +1 -0
- package/lib/TransformersTokenizer.spec.d.ts +2 -0
- package/lib/TransformersTokenizer.spec.d.ts.map +1 -0
- package/lib/TransformersTokenizer.spec.js +112 -0
- package/lib/TransformersTokenizer.spec.js.map +1 -0
- package/lib/WebFetcher.d.ts +14 -0
- package/lib/WebFetcher.d.ts.map +1 -0
- package/lib/WebFetcher.js +238 -0
- package/lib/WebFetcher.js.map +1 -0
- package/lib/WebFetcher.spec.d.ts +2 -0
- package/lib/WebFetcher.spec.d.ts.map +1 -0
- package/lib/WebFetcher.spec.js +263 -0
- package/lib/WebFetcher.spec.js.map +1 -0
- package/lib/browser.d.ts +30 -0
- package/lib/browser.d.ts.map +1 -0
- package/lib/browser.js +52 -0
- package/lib/browser.js.map +1 -0
- package/lib/codecs/IndexCodec.d.ts +37 -0
- package/lib/codecs/IndexCodec.d.ts.map +1 -0
- package/lib/codecs/IndexCodec.js +3 -0
- package/lib/codecs/IndexCodec.js.map +1 -0
- package/lib/codecs/JsonCodec.d.ts +19 -0
- package/lib/codecs/JsonCodec.d.ts.map +1 -0
- package/lib/codecs/JsonCodec.js +35 -0
- package/lib/codecs/JsonCodec.js.map +1 -0
- package/lib/codecs/JsonCodec.spec.d.ts +2 -0
- package/lib/codecs/JsonCodec.spec.d.ts.map +1 -0
- package/lib/codecs/JsonCodec.spec.js +66 -0
- package/lib/codecs/JsonCodec.spec.js.map +1 -0
- package/lib/codecs/LocalIndex.protobuf.spec.d.ts +2 -0
- package/lib/codecs/LocalIndex.protobuf.spec.d.ts.map +1 -0
- package/lib/codecs/LocalIndex.protobuf.spec.js +108 -0
- package/lib/codecs/LocalIndex.protobuf.spec.js.map +1 -0
- package/lib/codecs/ProtobufCodec.d.ts +20 -0
- package/lib/codecs/ProtobufCodec.d.ts.map +1 -0
- package/lib/codecs/ProtobufCodec.js +225 -0
- package/lib/codecs/ProtobufCodec.js.map +1 -0
- package/lib/codecs/ProtobufCodec.spec.d.ts +2 -0
- package/lib/codecs/ProtobufCodec.spec.d.ts.map +1 -0
- package/lib/codecs/ProtobufCodec.spec.js +155 -0
- package/lib/codecs/ProtobufCodec.spec.js.map +1 -0
- package/lib/codecs/index.d.ts +5 -0
- package/lib/codecs/index.d.ts.map +1 -0
- package/lib/codecs/index.js +21 -0
- package/lib/codecs/index.js.map +1 -0
- package/lib/codecs/migrateIndex.d.ts +24 -0
- package/lib/codecs/migrateIndex.d.ts.map +1 -0
- package/lib/codecs/migrateIndex.js +119 -0
- package/lib/codecs/migrateIndex.js.map +1 -0
- package/lib/codecs/migrateIndex.spec.d.ts +2 -0
- package/lib/codecs/migrateIndex.spec.d.ts.map +1 -0
- package/lib/codecs/migrateIndex.spec.js +151 -0
- package/lib/codecs/migrateIndex.spec.js.map +1 -0
- package/lib/codecs/schemas/index.proto +34 -0
- package/lib/index.d.ts +20 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +36 -0
- package/lib/index.js.map +1 -0
- package/lib/internals/Colorize.d.ts +14 -0
- package/lib/internals/Colorize.d.ts.map +1 -0
- package/lib/internals/Colorize.js +69 -0
- package/lib/internals/Colorize.js.map +1 -0
- package/lib/internals/index.d.ts +3 -0
- package/lib/internals/index.d.ts.map +1 -0
- package/lib/internals/index.js +19 -0
- package/lib/internals/index.js.map +1 -0
- package/lib/internals/types.d.ts +43 -0
- package/lib/internals/types.d.ts.map +1 -0
- package/lib/internals/types.js +3 -0
- package/lib/internals/types.js.map +1 -0
- package/lib/server/IndexManager.d.ts +78 -0
- package/lib/server/IndexManager.d.ts.map +1 -0
- package/lib/server/IndexManager.js +259 -0
- package/lib/server/IndexManager.js.map +1 -0
- package/lib/server/VectraServer.d.ts +40 -0
- package/lib/server/VectraServer.d.ts.map +1 -0
- package/lib/server/VectraServer.js +151 -0
- package/lib/server/VectraServer.js.map +1 -0
- package/lib/server/VectraServer.spec.d.ts +2 -0
- package/lib/server/VectraServer.spec.d.ts.map +1 -0
- package/lib/server/VectraServer.spec.js +322 -0
- package/lib/server/VectraServer.spec.js.map +1 -0
- package/lib/server/handlers/documentHandlers.d.ts +15 -0
- package/lib/server/handlers/documentHandlers.d.ts.map +1 -0
- package/lib/server/handlers/documentHandlers.js +95 -0
- package/lib/server/handlers/documentHandlers.js.map +1 -0
- package/lib/server/handlers/helpers.d.ts +23 -0
- package/lib/server/handlers/helpers.d.ts.map +1 -0
- package/lib/server/handlers/helpers.js +138 -0
- package/lib/server/handlers/helpers.js.map +1 -0
- package/lib/server/handlers/index.d.ts +8 -0
- package/lib/server/handlers/index.d.ts.map +1 -0
- package/lib/server/handlers/index.js +22 -0
- package/lib/server/handlers/index.js.map +1 -0
- package/lib/server/handlers/indexHandlers.d.ts +14 -0
- package/lib/server/handlers/indexHandlers.d.ts.map +1 -0
- package/lib/server/handlers/indexHandlers.js +85 -0
- package/lib/server/handlers/indexHandlers.js.map +1 -0
- package/lib/server/handlers/itemHandlers.d.ts +34 -0
- package/lib/server/handlers/itemHandlers.d.ts.map +1 -0
- package/lib/server/handlers/itemHandlers.js +166 -0
- package/lib/server/handlers/itemHandlers.js.map +1 -0
- package/lib/server/handlers/lifecycleHandlers.d.ts +11 -0
- package/lib/server/handlers/lifecycleHandlers.d.ts.map +1 -0
- package/lib/server/handlers/lifecycleHandlers.js +31 -0
- package/lib/server/handlers/lifecycleHandlers.js.map +1 -0
- package/lib/server/handlers/queryHandlers.d.ts +27 -0
- package/lib/server/handlers/queryHandlers.d.ts.map +1 -0
- package/lib/server/handlers/queryHandlers.js +135 -0
- package/lib/server/handlers/queryHandlers.js.map +1 -0
- package/lib/server/handlers/statsHandlers.d.ts +17 -0
- package/lib/server/handlers/statsHandlers.d.ts.map +1 -0
- package/lib/server/handlers/statsHandlers.js +81 -0
- package/lib/server/handlers/statsHandlers.js.map +1 -0
- package/lib/server/index.d.ts +4 -0
- package/lib/server/index.d.ts.map +1 -0
- package/lib/server/index.js +23 -0
- package/lib/server/index.js.map +1 -0
- package/lib/storage/FileStorage.d.ts +92 -0
- package/lib/storage/FileStorage.d.ts.map +1 -0
- package/lib/storage/FileStorage.js +3 -0
- package/lib/storage/FileStorage.js.map +1 -0
- package/lib/storage/FileStorageUtilities.d.ts +36 -0
- package/lib/storage/FileStorageUtilities.d.ts.map +1 -0
- package/lib/storage/FileStorageUtilities.js +91 -0
- package/lib/storage/FileStorageUtilities.js.map +1 -0
- package/lib/storage/FileStorageUtilities.spec.d.ts +2 -0
- package/lib/storage/FileStorageUtilities.spec.d.ts.map +1 -0
- package/lib/storage/FileStorageUtilities.spec.js +98 -0
- package/lib/storage/FileStorageUtilities.spec.js.map +1 -0
- package/lib/storage/FileType.d.ts +29 -0
- package/lib/storage/FileType.d.ts.map +1 -0
- package/lib/storage/FileType.js +38 -0
- package/lib/storage/FileType.js.map +1 -0
- package/lib/storage/IndexedDBStorage.d.ts +47 -0
- package/lib/storage/IndexedDBStorage.d.ts.map +1 -0
- package/lib/storage/IndexedDBStorage.js +347 -0
- package/lib/storage/IndexedDBStorage.js.map +1 -0
- package/lib/storage/LocalFileStorage.browser.d.ts +19 -0
- package/lib/storage/LocalFileStorage.browser.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.browser.js +43 -0
- package/lib/storage/LocalFileStorage.browser.js.map +1 -0
- package/lib/storage/LocalFileStorage.d.ts +23 -0
- package/lib/storage/LocalFileStorage.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.js +152 -0
- package/lib/storage/LocalFileStorage.js.map +1 -0
- package/lib/storage/LocalFileStorage.spec.d.ts +2 -0
- package/lib/storage/LocalFileStorage.spec.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.spec.js +249 -0
- package/lib/storage/LocalFileStorage.spec.js.map +1 -0
- package/lib/storage/VirtualFileStorage.d.ts +18 -0
- package/lib/storage/VirtualFileStorage.d.ts.map +1 -0
- package/lib/storage/VirtualFileStorage.js +178 -0
- package/lib/storage/VirtualFileStorage.js.map +1 -0
- package/lib/storage/VirtualFileStorage.spec.d.ts +2 -0
- package/lib/storage/VirtualFileStorage.spec.d.ts.map +1 -0
- package/lib/storage/VirtualFileStorage.spec.js +302 -0
- package/lib/storage/VirtualFileStorage.spec.js.map +1 -0
- package/lib/storage/index.d.ts +6 -0
- package/lib/storage/index.d.ts.map +1 -0
- package/lib/storage/index.js +22 -0
- package/lib/storage/index.js.map +1 -0
- package/lib/templates/templates/csharp/README.md +48 -0
- package/lib/templates/templates/csharp/VectraClient.cs +234 -0
- package/lib/templates/templates/go/README.md +71 -0
- package/lib/templates/templates/go/vectra_client.go +322 -0
- package/lib/templates/templates/java/README.md +81 -0
- package/lib/templates/templates/java/VectraClient.java +232 -0
- package/lib/templates/templates/python/README.md +37 -0
- package/lib/templates/templates/python/vectra_client.py +279 -0
- package/lib/templates/templates/rust/Cargo.toml +14 -0
- package/lib/templates/templates/rust/README.md +39 -0
- package/lib/templates/templates/rust/build.rs +4 -0
- package/lib/templates/templates/rust/lib.rs +284 -0
- package/lib/templates/templates/typescript/README.md +96 -0
- package/lib/templates/templates/typescript/VectraClient.ts +374 -0
- package/lib/templates/typescript/VectraClient.d.ts +114 -0
- package/lib/templates/typescript/VectraClient.d.ts.map +1 -0
- package/lib/templates/typescript/VectraClient.js +328 -0
- package/lib/templates/typescript/VectraClient.js.map +1 -0
- package/lib/types.d.ts +153 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +18 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/pathUtils.d.ts +40 -0
- package/lib/utils/pathUtils.d.ts.map +1 -0
- package/lib/utils/pathUtils.js +98 -0
- package/lib/utils/pathUtils.js.map +1 -0
- package/lib/vectra-cli.d.ts +2 -0
- package/lib/vectra-cli.d.ts.map +1 -1
- package/lib/vectra-cli.generate.spec.d.ts +2 -0
- package/lib/vectra-cli.generate.spec.d.ts.map +1 -0
- package/lib/vectra-cli.generate.spec.js +112 -0
- package/lib/vectra-cli.generate.spec.js.map +1 -0
- package/lib/vectra-cli.js +760 -0
- package/lib/vectra-cli.js.map +1 -0
- package/lib/vectra-cli.spec.d.ts +1 -0
- package/lib/vectra-cli.spec.d.ts.map +1 -0
- package/lib/vectra-cli.spec.js +2 -0
- package/lib/vectra-cli.spec.js.map +1 -0
- package/package.json +91 -16
- package/proto/vectra_service.proto +276 -0
- package/src/BrowserWebFetcher.ts +345 -0
- package/src/FileFetcher.spec.ts +234 -0
- package/src/FileFetcher.ts +37 -25
- package/src/FolderWatcher.spec.ts +288 -0
- package/src/FolderWatcher.ts +304 -0
- package/src/GPT3Tokenizer.spec.ts +50 -0
- package/src/ItemSelector.spec.ts +252 -0
- package/src/ItemSelector.ts +163 -150
- package/src/LocalDocument.spec.ts +211 -0
- package/src/LocalDocument.ts +88 -94
- package/src/LocalDocumentIndex.spec.ts +481 -0
- package/src/LocalDocumentIndex.ts +39 -40
- package/src/LocalDocumentResult.spec.ts +373 -0
- package/src/LocalDocumentResult.ts +489 -319
- package/src/LocalEmbeddings.spec.ts +138 -0
- package/src/LocalEmbeddings.ts +120 -0
- package/src/LocalIndex.spec.ts +808 -66
- package/src/LocalIndex.ts +479 -429
- package/src/OpenAIEmbeddings.spec.ts +354 -0
- package/src/OpenAIEmbeddings.ts +26 -27
- package/src/TextSplitter.spec.ts +342 -0
- package/src/TextSplitter.ts +517 -532
- package/src/TransformersEmbeddings.spec.ts +188 -0
- package/src/TransformersEmbeddings.ts +232 -0
- package/src/TransformersTokenizer.spec.ts +143 -0
- package/src/TransformersTokenizer.ts +45 -0
- package/src/WebFetcher.spec.ts +288 -0
- package/src/WebFetcher.ts +184 -186
- package/src/browser.ts +69 -0
- package/src/codecs/IndexCodec.ts +40 -0
- package/src/codecs/JsonCodec.spec.ts +70 -0
- package/src/codecs/JsonCodec.ts +37 -0
- package/src/codecs/LocalIndex.protobuf.spec.ts +115 -0
- package/src/codecs/ProtobufCodec.spec.ts +166 -0
- package/src/codecs/ProtobufCodec.ts +193 -0
- package/src/codecs/index.ts +4 -0
- package/src/codecs/migrateIndex.spec.ts +176 -0
- package/src/codecs/migrateIndex.ts +125 -0
- package/src/codecs/schemas/index.proto +34 -0
- package/src/index.ts +9 -1
- package/src/internals/Colorize.ts +19 -16
- package/src/server/IndexManager.ts +243 -0
- package/src/server/VectraServer.spec.ts +303 -0
- package/src/server/VectraServer.ts +156 -0
- package/src/server/handlers/documentHandlers.ts +59 -0
- package/src/server/handlers/helpers.ts +93 -0
- package/src/server/handlers/index.ts +7 -0
- package/src/server/handlers/indexHandlers.ts +44 -0
- package/src/server/handlers/itemHandlers.ts +140 -0
- package/src/server/handlers/lifecycleHandlers.ts +26 -0
- package/src/server/handlers/queryHandlers.ts +96 -0
- package/src/server/handlers/statsHandlers.ts +38 -0
- package/src/server/index.ts +3 -0
- package/src/storage/FileStorage.ts +105 -0
- package/src/storage/FileStorageUtilities.spec.ts +106 -0
- package/src/storage/FileStorageUtilities.ts +77 -0
- package/src/storage/FileType.ts +61 -0
- package/src/storage/IndexedDBStorage.ts +365 -0
- package/src/storage/LocalFileStorage.browser.ts +52 -0
- package/src/storage/LocalFileStorage.spec.ts +292 -0
- package/src/storage/LocalFileStorage.ts +98 -0
- package/src/storage/VirtualFileStorage.spec.ts +307 -0
- package/src/storage/VirtualFileStorage.ts +169 -0
- package/src/storage/index.ts +5 -0
- package/src/templates/csharp/README.md +48 -0
- package/src/templates/csharp/VectraClient.cs +234 -0
- package/src/templates/go/README.md +71 -0
- package/src/templates/go/vectra_client.go +322 -0
- package/src/templates/java/README.md +81 -0
- package/src/templates/java/VectraClient.java +232 -0
- package/src/templates/python/README.md +37 -0
- package/src/templates/python/vectra_client.py +279 -0
- package/src/templates/rust/Cargo.toml +14 -0
- package/src/templates/rust/README.md +39 -0
- package/src/templates/rust/build.rs +4 -0
- package/src/templates/rust/lib.rs +284 -0
- package/src/templates/typescript/README.md +96 -0
- package/src/templates/typescript/VectraClient.ts +374 -0
- package/src/types.ts +131 -123
- package/src/utils/index.ts +1 -0
- package/src/utils/pathUtils.ts +106 -0
- package/src/vectra-cli.generate.spec.ts +72 -0
- package/src/vectra-cli.spec.ts +0 -0
- package/src/vectra-cli.ts +687 -246
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// Vectra gRPC client — thin idiomatic wrapper over generated stubs.
|
|
2
|
+
//
|
|
3
|
+
// Usage:
|
|
4
|
+
// using var client = new VectraClient();
|
|
5
|
+
// var results = await client.QueryDocumentsAsync("my-index", "search query");
|
|
6
|
+
//
|
|
7
|
+
// Generate stubs first (see README.md).
|
|
8
|
+
|
|
9
|
+
using System.Text.Json;
|
|
10
|
+
using Grpc.Net.Client;
|
|
11
|
+
using Vectra;
|
|
12
|
+
|
|
13
|
+
namespace Vectra.Client;
|
|
14
|
+
|
|
15
|
+
/// <summary>Idiomatic C# client for the Vectra gRPC server.</summary>
|
|
16
|
+
public sealed class VectraClient : IDisposable
|
|
17
|
+
{
|
|
18
|
+
private readonly GrpcChannel _channel;
|
|
19
|
+
private readonly VectraService.VectraServiceClient _stub;
|
|
20
|
+
|
|
21
|
+
public VectraClient(string host = "127.0.0.1", int port = 50051)
|
|
22
|
+
{
|
|
23
|
+
_channel = GrpcChannel.ForAddress($"http://{host}:{port}");
|
|
24
|
+
_stub = new VectraService.VectraServiceClient(_channel);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public void Dispose() => _channel.Dispose();
|
|
28
|
+
|
|
29
|
+
// ── Index Management ──────────────────────────────────
|
|
30
|
+
|
|
31
|
+
public async Task CreateIndexAsync(
|
|
32
|
+
string name,
|
|
33
|
+
string format = "json",
|
|
34
|
+
bool isDocumentIndex = false,
|
|
35
|
+
uint chunkSize = 512,
|
|
36
|
+
uint chunkOverlap = 0)
|
|
37
|
+
{
|
|
38
|
+
var req = new CreateIndexRequest
|
|
39
|
+
{
|
|
40
|
+
IndexName = name,
|
|
41
|
+
Format = format,
|
|
42
|
+
IsDocumentIndex = isDocumentIndex,
|
|
43
|
+
};
|
|
44
|
+
if (isDocumentIndex)
|
|
45
|
+
{
|
|
46
|
+
req.DocumentConfig = new DocumentIndexConfig
|
|
47
|
+
{
|
|
48
|
+
Version = 1,
|
|
49
|
+
ChunkSize = chunkSize,
|
|
50
|
+
ChunkOverlap = chunkOverlap,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
await _stub.CreateIndexAsync(req);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public async Task DeleteIndexAsync(string name)
|
|
57
|
+
=> await _stub.DeleteIndexAsync(new DeleteIndexRequest { IndexName = name });
|
|
58
|
+
|
|
59
|
+
public async Task<List<IndexInfo>> ListIndexesAsync()
|
|
60
|
+
{
|
|
61
|
+
var resp = await _stub.ListIndexesAsync(new ListIndexesRequest());
|
|
62
|
+
return resp.Indexes.ToList();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── Item Operations ───────────────────────────────────
|
|
66
|
+
|
|
67
|
+
public async Task<string> InsertItemAsync(
|
|
68
|
+
string index,
|
|
69
|
+
string text = "",
|
|
70
|
+
IEnumerable<float>? vector = null,
|
|
71
|
+
Dictionary<string, object>? metadata = null,
|
|
72
|
+
string id = "")
|
|
73
|
+
{
|
|
74
|
+
var req = new InsertItemRequest
|
|
75
|
+
{
|
|
76
|
+
IndexName = index,
|
|
77
|
+
Text = text,
|
|
78
|
+
Id = id,
|
|
79
|
+
};
|
|
80
|
+
if (vector != null) req.Vector.AddRange(vector);
|
|
81
|
+
if (metadata != null) SetMetadata(req.Metadata, metadata);
|
|
82
|
+
var resp = await _stub.InsertItemAsync(req);
|
|
83
|
+
return resp.Id;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public async Task<string> UpsertItemAsync(
|
|
87
|
+
string index,
|
|
88
|
+
string id,
|
|
89
|
+
string text = "",
|
|
90
|
+
IEnumerable<float>? vector = null,
|
|
91
|
+
Dictionary<string, object>? metadata = null)
|
|
92
|
+
{
|
|
93
|
+
var req = new UpsertItemRequest
|
|
94
|
+
{
|
|
95
|
+
IndexName = index,
|
|
96
|
+
Id = id,
|
|
97
|
+
Text = text,
|
|
98
|
+
};
|
|
99
|
+
if (vector != null) req.Vector.AddRange(vector);
|
|
100
|
+
if (metadata != null) SetMetadata(req.Metadata, metadata);
|
|
101
|
+
var resp = await _stub.UpsertItemAsync(req);
|
|
102
|
+
return resp.Id;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public async Task<ItemResult?> GetItemAsync(string index, string id)
|
|
106
|
+
{
|
|
107
|
+
var resp = await _stub.GetItemAsync(new GetItemRequest { IndexName = index, Id = id });
|
|
108
|
+
return resp.Item;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public async Task DeleteItemAsync(string index, string id)
|
|
112
|
+
=> await _stub.DeleteItemAsync(new DeleteItemRequest { IndexName = index, Id = id });
|
|
113
|
+
|
|
114
|
+
public async Task<List<ItemResult>> ListItemsAsync(
|
|
115
|
+
string index,
|
|
116
|
+
Dictionary<string, object>? filter = null)
|
|
117
|
+
{
|
|
118
|
+
var req = new ListItemsRequest { IndexName = index };
|
|
119
|
+
if (filter != null)
|
|
120
|
+
req.Filter = new MetadataFilter { FilterJson = JsonSerializer.Serialize(filter) };
|
|
121
|
+
var resp = await _stub.ListItemsAsync(req);
|
|
122
|
+
return resp.Items.ToList();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ── Query ─────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
public async Task<List<ItemResult>> QueryItemsAsync(
|
|
128
|
+
string index,
|
|
129
|
+
string text = "",
|
|
130
|
+
IEnumerable<float>? vector = null,
|
|
131
|
+
uint topK = 10,
|
|
132
|
+
Dictionary<string, object>? filter = null)
|
|
133
|
+
{
|
|
134
|
+
var req = new QueryItemsRequest
|
|
135
|
+
{
|
|
136
|
+
IndexName = index,
|
|
137
|
+
Text = text,
|
|
138
|
+
TopK = topK,
|
|
139
|
+
};
|
|
140
|
+
if (vector != null) req.Vector.AddRange(vector);
|
|
141
|
+
if (filter != null)
|
|
142
|
+
req.Filter = new MetadataFilter { FilterJson = JsonSerializer.Serialize(filter) };
|
|
143
|
+
var resp = await _stub.QueryItemsAsync(req);
|
|
144
|
+
return resp.Results.ToList();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public async Task<List<DocumentResult>> QueryDocumentsAsync(
|
|
148
|
+
string index,
|
|
149
|
+
string query,
|
|
150
|
+
uint maxDocuments = 10,
|
|
151
|
+
uint maxChunks = 50,
|
|
152
|
+
Dictionary<string, object>? filter = null,
|
|
153
|
+
bool useBm25 = false)
|
|
154
|
+
{
|
|
155
|
+
var req = new QueryDocumentsRequest
|
|
156
|
+
{
|
|
157
|
+
IndexName = index,
|
|
158
|
+
Query = query,
|
|
159
|
+
MaxDocuments = maxDocuments,
|
|
160
|
+
MaxChunks = maxChunks,
|
|
161
|
+
UseBm25 = useBm25,
|
|
162
|
+
};
|
|
163
|
+
if (filter != null)
|
|
164
|
+
req.Filter = new MetadataFilter { FilterJson = JsonSerializer.Serialize(filter) };
|
|
165
|
+
var resp = await _stub.QueryDocumentsAsync(req);
|
|
166
|
+
return resp.Results.ToList();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ── Document Operations ───────────────────────────────
|
|
170
|
+
|
|
171
|
+
public async Task<string> UpsertDocumentAsync(
|
|
172
|
+
string index,
|
|
173
|
+
string uri,
|
|
174
|
+
string text,
|
|
175
|
+
string docType = "",
|
|
176
|
+
Dictionary<string, object>? metadata = null)
|
|
177
|
+
{
|
|
178
|
+
var req = new UpsertDocumentRequest
|
|
179
|
+
{
|
|
180
|
+
IndexName = index,
|
|
181
|
+
Uri = uri,
|
|
182
|
+
Text = text,
|
|
183
|
+
DocType = docType,
|
|
184
|
+
};
|
|
185
|
+
if (metadata != null) SetMetadata(req.Metadata, metadata);
|
|
186
|
+
var resp = await _stub.UpsertDocumentAsync(req);
|
|
187
|
+
return resp.DocumentId;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
public async Task DeleteDocumentAsync(string index, string uri)
|
|
191
|
+
=> await _stub.DeleteDocumentAsync(new DeleteDocumentRequest { IndexName = index, Uri = uri });
|
|
192
|
+
|
|
193
|
+
public async Task<List<DocumentInfo>> ListDocumentsAsync(string index)
|
|
194
|
+
{
|
|
195
|
+
var resp = await _stub.ListDocumentsAsync(new ListDocumentsRequest { IndexName = index });
|
|
196
|
+
return resp.Documents.ToList();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ── Stats ─────────────────────────────────────────────
|
|
200
|
+
|
|
201
|
+
public async Task<GetIndexStatsResponse> GetIndexStatsAsync(string index)
|
|
202
|
+
=> await _stub.GetIndexStatsAsync(new GetIndexStatsRequest { IndexName = index });
|
|
203
|
+
|
|
204
|
+
public async Task<GetCatalogStatsResponse> GetCatalogStatsAsync(string index)
|
|
205
|
+
=> await _stub.GetCatalogStatsAsync(new GetCatalogStatsRequest { IndexName = index });
|
|
206
|
+
|
|
207
|
+
// ── Lifecycle ─────────────────────────────────────────
|
|
208
|
+
|
|
209
|
+
public async Task<HealthcheckResponse> HealthcheckAsync()
|
|
210
|
+
=> await _stub.HealthcheckAsync(new HealthcheckRequest());
|
|
211
|
+
|
|
212
|
+
public async Task ShutdownAsync()
|
|
213
|
+
=> await _stub.ShutdownAsync(new ShutdownRequest());
|
|
214
|
+
|
|
215
|
+
// ── Helpers ───────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
private static void SetMetadata(
|
|
218
|
+
Google.Protobuf.Collections.MapField<string, MetadataValue> protoMap,
|
|
219
|
+
Dictionary<string, object> metadata)
|
|
220
|
+
{
|
|
221
|
+
foreach (var (key, value) in metadata)
|
|
222
|
+
{
|
|
223
|
+
protoMap[key] = value switch
|
|
224
|
+
{
|
|
225
|
+
bool b => new MetadataValue { BoolValue = b },
|
|
226
|
+
int i => new MetadataValue { NumberValue = i },
|
|
227
|
+
long l => new MetadataValue { NumberValue = l },
|
|
228
|
+
float f => new MetadataValue { NumberValue = f },
|
|
229
|
+
double d => new MetadataValue { NumberValue = d },
|
|
230
|
+
_ => new MetadataValue { StringValue = value?.ToString() ?? "" },
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Vectra Go Client
|
|
2
|
+
|
|
3
|
+
Thin idiomatic Go wrapper over the Vectra gRPC service.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Go 1.21+
|
|
8
|
+
- `protoc` (Protocol Buffers compiler) — install via your package manager
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
|
|
12
|
+
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Generate gRPC stubs
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
protoc --go_out=. --go-grpc_out=. vectra_service.proto
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This produces `vectra_service.pb.go` and `vectra_service_grpc.pb.go` in the `vectra_service/` directory.
|
|
22
|
+
|
|
23
|
+
## Setup
|
|
24
|
+
|
|
25
|
+
1. Update the import path in `vectra_client.go` to match your module (replace `your_module/vectra_service`).
|
|
26
|
+
2. Run `go mod init` if you haven't already, then `go mod tidy` to fetch dependencies.
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
```go
|
|
31
|
+
package main
|
|
32
|
+
|
|
33
|
+
import (
|
|
34
|
+
"context"
|
|
35
|
+
"fmt"
|
|
36
|
+
"log"
|
|
37
|
+
|
|
38
|
+
vectra "your_module/vectra" // adjust import path
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
func main() {
|
|
42
|
+
client, err := vectra.NewClient("127.0.0.1:50051")
|
|
43
|
+
if err != nil {
|
|
44
|
+
log.Fatal(err)
|
|
45
|
+
}
|
|
46
|
+
defer client.Close()
|
|
47
|
+
|
|
48
|
+
ctx := context.Background()
|
|
49
|
+
|
|
50
|
+
// Create a document index
|
|
51
|
+
err = client.CreateIndex(ctx, "my-index", "json", true)
|
|
52
|
+
if err != nil {
|
|
53
|
+
log.Fatal(err)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Add a document
|
|
57
|
+
_, err = client.UpsertDocument(ctx, "my-index", "doc1.txt", "Hello world...", "", nil)
|
|
58
|
+
if err != nil {
|
|
59
|
+
log.Fatal(err)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Query
|
|
63
|
+
results, err := client.QueryDocuments(ctx, "my-index", "hello", nil)
|
|
64
|
+
if err != nil {
|
|
65
|
+
log.Fatal(err)
|
|
66
|
+
}
|
|
67
|
+
for _, doc := range results {
|
|
68
|
+
fmt.Printf("%s (score: %.3f)\n", doc.Uri, doc.Score)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// Package vectra provides an idiomatic Go client for the Vectra gRPC server.
|
|
2
|
+
//
|
|
3
|
+
// Usage:
|
|
4
|
+
//
|
|
5
|
+
// client, err := vectra.NewClient("127.0.0.1:50051")
|
|
6
|
+
// if err != nil {
|
|
7
|
+
// log.Fatal(err)
|
|
8
|
+
// }
|
|
9
|
+
// defer client.Close()
|
|
10
|
+
//
|
|
11
|
+
// results, err := client.QueryDocuments(ctx, "my-index", "search query", nil)
|
|
12
|
+
package vectra
|
|
13
|
+
|
|
14
|
+
import (
|
|
15
|
+
"context"
|
|
16
|
+
"encoding/json"
|
|
17
|
+
"fmt"
|
|
18
|
+
|
|
19
|
+
pb "your_module/vectra_service" // replace with your actual module path
|
|
20
|
+
|
|
21
|
+
"google.golang.org/grpc"
|
|
22
|
+
"google.golang.org/grpc/credentials/insecure"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
// Client is an idiomatic Go client for the Vectra gRPC server.
|
|
26
|
+
type Client struct {
|
|
27
|
+
conn *grpc.ClientConn
|
|
28
|
+
stub pb.VectraServiceClient
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// NewClient connects to a Vectra gRPC server at the given address.
|
|
32
|
+
func NewClient(addr string) (*Client, error) {
|
|
33
|
+
conn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
|
34
|
+
if err != nil {
|
|
35
|
+
return nil, fmt.Errorf("vectra: dial %s: %w", addr, err)
|
|
36
|
+
}
|
|
37
|
+
return &Client{conn: conn, stub: pb.NewVectraServiceClient(conn)}, nil
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Close releases the underlying gRPC connection.
|
|
41
|
+
func (c *Client) Close() error {
|
|
42
|
+
return c.conn.Close()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Index Management ──────────────────────────────────
|
|
46
|
+
|
|
47
|
+
// CreateIndex creates a new index on the server.
|
|
48
|
+
func (c *Client) CreateIndex(ctx context.Context, name, format string, isDocumentIndex bool) error {
|
|
49
|
+
req := &pb.CreateIndexRequest{
|
|
50
|
+
IndexName: name,
|
|
51
|
+
Format: format,
|
|
52
|
+
IsDocumentIndex: isDocumentIndex,
|
|
53
|
+
}
|
|
54
|
+
if isDocumentIndex {
|
|
55
|
+
req.DocumentConfig = &pb.DocumentIndexConfig{
|
|
56
|
+
Version: 1,
|
|
57
|
+
ChunkSize: 512,
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
_, err := c.stub.CreateIndex(ctx, req)
|
|
61
|
+
return err
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// DeleteIndex deletes an index from the server.
|
|
65
|
+
func (c *Client) DeleteIndex(ctx context.Context, name string) error {
|
|
66
|
+
_, err := c.stub.DeleteIndex(ctx, &pb.DeleteIndexRequest{IndexName: name})
|
|
67
|
+
return err
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// IndexInfo holds summary information about an index.
|
|
71
|
+
type IndexInfo struct {
|
|
72
|
+
Name string
|
|
73
|
+
Format string
|
|
74
|
+
IsDocumentIndex bool
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ListIndexes returns all indexes managed by the server.
|
|
78
|
+
func (c *Client) ListIndexes(ctx context.Context) ([]IndexInfo, error) {
|
|
79
|
+
resp, err := c.stub.ListIndexes(ctx, &pb.ListIndexesRequest{})
|
|
80
|
+
if err != nil {
|
|
81
|
+
return nil, err
|
|
82
|
+
}
|
|
83
|
+
out := make([]IndexInfo, len(resp.Indexes))
|
|
84
|
+
for i, idx := range resp.Indexes {
|
|
85
|
+
out[i] = IndexInfo{Name: idx.Name, Format: idx.Format, IsDocumentIndex: idx.IsDocumentIndex}
|
|
86
|
+
}
|
|
87
|
+
return out, nil
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── Item Operations ───────────────────────────────────
|
|
91
|
+
|
|
92
|
+
// InsertItem adds a new item to an index. Returns the assigned ID.
|
|
93
|
+
func (c *Client) InsertItem(ctx context.Context, index, text string, vector []float32, metadata map[string]*pb.MetadataValue, id string) (string, error) {
|
|
94
|
+
req := &pb.InsertItemRequest{
|
|
95
|
+
IndexName: index,
|
|
96
|
+
Text: text,
|
|
97
|
+
Vector: vector,
|
|
98
|
+
Metadata: metadata,
|
|
99
|
+
Id: id,
|
|
100
|
+
}
|
|
101
|
+
resp, err := c.stub.InsertItem(ctx, req)
|
|
102
|
+
if err != nil {
|
|
103
|
+
return "", err
|
|
104
|
+
}
|
|
105
|
+
return resp.Id, nil
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// UpsertItem inserts or updates an item. Returns the ID.
|
|
109
|
+
func (c *Client) UpsertItem(ctx context.Context, index, id, text string, vector []float32, metadata map[string]*pb.MetadataValue) (string, error) {
|
|
110
|
+
req := &pb.UpsertItemRequest{
|
|
111
|
+
IndexName: index,
|
|
112
|
+
Id: id,
|
|
113
|
+
Text: text,
|
|
114
|
+
Vector: vector,
|
|
115
|
+
Metadata: metadata,
|
|
116
|
+
}
|
|
117
|
+
resp, err := c.stub.UpsertItem(ctx, req)
|
|
118
|
+
if err != nil {
|
|
119
|
+
return "", err
|
|
120
|
+
}
|
|
121
|
+
return resp.Id, nil
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// GetItem retrieves a single item by ID.
|
|
125
|
+
func (c *Client) GetItem(ctx context.Context, index, id string) (*pb.ItemResult, error) {
|
|
126
|
+
resp, err := c.stub.GetItem(ctx, &pb.GetItemRequest{IndexName: index, Id: id})
|
|
127
|
+
if err != nil {
|
|
128
|
+
return nil, err
|
|
129
|
+
}
|
|
130
|
+
return resp.Item, nil
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// DeleteItem removes an item by ID.
|
|
134
|
+
func (c *Client) DeleteItem(ctx context.Context, index, id string) error {
|
|
135
|
+
_, err := c.stub.DeleteItem(ctx, &pb.DeleteItemRequest{IndexName: index, Id: id})
|
|
136
|
+
return err
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ListItems returns items in an index, optionally filtered.
|
|
140
|
+
// filterJSON should be a JSON string with MongoDB-style filter operators, or empty.
|
|
141
|
+
func (c *Client) ListItems(ctx context.Context, index, filterJSON string) ([]*pb.ItemResult, error) {
|
|
142
|
+
req := &pb.ListItemsRequest{IndexName: index}
|
|
143
|
+
if filterJSON != "" {
|
|
144
|
+
req.Filter = &pb.MetadataFilter{FilterJson: filterJSON}
|
|
145
|
+
}
|
|
146
|
+
resp, err := c.stub.ListItems(ctx, req)
|
|
147
|
+
if err != nil {
|
|
148
|
+
return nil, err
|
|
149
|
+
}
|
|
150
|
+
return resp.Items, nil
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ── Query ─────────────────────────────────────────────
|
|
154
|
+
|
|
155
|
+
// QueryItems performs a vector similarity query. Returns ranked results.
|
|
156
|
+
func (c *Client) QueryItems(ctx context.Context, index, text string, topK uint32, filterJSON string) ([]*pb.ItemResult, error) {
|
|
157
|
+
req := &pb.QueryItemsRequest{
|
|
158
|
+
IndexName: index,
|
|
159
|
+
Text: text,
|
|
160
|
+
TopK: topK,
|
|
161
|
+
}
|
|
162
|
+
if filterJSON != "" {
|
|
163
|
+
req.Filter = &pb.MetadataFilter{FilterJson: filterJSON}
|
|
164
|
+
}
|
|
165
|
+
resp, err := c.stub.QueryItems(ctx, req)
|
|
166
|
+
if err != nil {
|
|
167
|
+
return nil, err
|
|
168
|
+
}
|
|
169
|
+
return resp.Results, nil
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// QueryDocumentsOpts holds optional parameters for QueryDocuments.
|
|
173
|
+
type QueryDocumentsOpts struct {
|
|
174
|
+
MaxDocuments uint32
|
|
175
|
+
MaxChunks uint32
|
|
176
|
+
FilterJSON string
|
|
177
|
+
UseBM25 bool
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// QueryDocuments performs a document-level semantic search.
|
|
181
|
+
func (c *Client) QueryDocuments(ctx context.Context, index, query string, opts *QueryDocumentsOpts) ([]*pb.DocumentResult, error) {
|
|
182
|
+
req := &pb.QueryDocumentsRequest{
|
|
183
|
+
IndexName: index,
|
|
184
|
+
Query: query,
|
|
185
|
+
MaxDocuments: 10,
|
|
186
|
+
MaxChunks: 50,
|
|
187
|
+
}
|
|
188
|
+
if opts != nil {
|
|
189
|
+
if opts.MaxDocuments > 0 {
|
|
190
|
+
req.MaxDocuments = opts.MaxDocuments
|
|
191
|
+
}
|
|
192
|
+
if opts.MaxChunks > 0 {
|
|
193
|
+
req.MaxChunks = opts.MaxChunks
|
|
194
|
+
}
|
|
195
|
+
if opts.FilterJSON != "" {
|
|
196
|
+
req.Filter = &pb.MetadataFilter{FilterJson: opts.FilterJSON}
|
|
197
|
+
}
|
|
198
|
+
req.UseBm25 = opts.UseBM25
|
|
199
|
+
}
|
|
200
|
+
resp, err := c.stub.QueryDocuments(ctx, req)
|
|
201
|
+
if err != nil {
|
|
202
|
+
return nil, err
|
|
203
|
+
}
|
|
204
|
+
return resp.Results, nil
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ── Document Operations ───────────────────────────────
|
|
208
|
+
|
|
209
|
+
// UpsertDocument inserts or updates a document. Returns the document ID.
|
|
210
|
+
func (c *Client) UpsertDocument(ctx context.Context, index, uri, text, docType string, metadata map[string]*pb.MetadataValue) (string, error) {
|
|
211
|
+
req := &pb.UpsertDocumentRequest{
|
|
212
|
+
IndexName: index,
|
|
213
|
+
Uri: uri,
|
|
214
|
+
Text: text,
|
|
215
|
+
DocType: docType,
|
|
216
|
+
Metadata: metadata,
|
|
217
|
+
}
|
|
218
|
+
resp, err := c.stub.UpsertDocument(ctx, req)
|
|
219
|
+
if err != nil {
|
|
220
|
+
return "", err
|
|
221
|
+
}
|
|
222
|
+
return resp.DocumentId, nil
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// DeleteDocument removes a document by URI.
|
|
226
|
+
func (c *Client) DeleteDocument(ctx context.Context, index, uri string) error {
|
|
227
|
+
_, err := c.stub.DeleteDocument(ctx, &pb.DeleteDocumentRequest{IndexName: index, Uri: uri})
|
|
228
|
+
return err
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// DocumentInfo holds summary information about a document.
|
|
232
|
+
type DocumentInfo struct {
|
|
233
|
+
URI string
|
|
234
|
+
DocumentID string
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// ListDocuments returns all documents in a document index.
|
|
238
|
+
func (c *Client) ListDocuments(ctx context.Context, index string) ([]DocumentInfo, error) {
|
|
239
|
+
resp, err := c.stub.ListDocuments(ctx, &pb.ListDocumentsRequest{IndexName: index})
|
|
240
|
+
if err != nil {
|
|
241
|
+
return nil, err
|
|
242
|
+
}
|
|
243
|
+
out := make([]DocumentInfo, len(resp.Documents))
|
|
244
|
+
for i, d := range resp.Documents {
|
|
245
|
+
out[i] = DocumentInfo{URI: d.Uri, DocumentID: d.DocumentId}
|
|
246
|
+
}
|
|
247
|
+
return out, nil
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ── Stats ─────────────────────────────────────────────
|
|
251
|
+
|
|
252
|
+
// GetIndexStats returns statistics for an index.
|
|
253
|
+
func (c *Client) GetIndexStats(ctx context.Context, index string) (*pb.GetIndexStatsResponse, error) {
|
|
254
|
+
resp, err := c.stub.GetIndexStats(ctx, &pb.GetIndexStatsRequest{IndexName: index})
|
|
255
|
+
if err != nil {
|
|
256
|
+
return nil, err
|
|
257
|
+
}
|
|
258
|
+
return resp, nil
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// GetCatalogStats returns catalog statistics for a document index.
|
|
262
|
+
func (c *Client) GetCatalogStats(ctx context.Context, index string) (*pb.GetCatalogStatsResponse, error) {
|
|
263
|
+
resp, err := c.stub.GetCatalogStats(ctx, &pb.GetCatalogStatsRequest{IndexName: index})
|
|
264
|
+
if err != nil {
|
|
265
|
+
return nil, err
|
|
266
|
+
}
|
|
267
|
+
return resp, nil
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ── Lifecycle ─────────────────────────────────────────
|
|
271
|
+
|
|
272
|
+
// HealthcheckResult holds the server health status.
|
|
273
|
+
type HealthcheckResult struct {
|
|
274
|
+
Status string
|
|
275
|
+
UptimeSeconds float64
|
|
276
|
+
LoadedIndexes int32
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Healthcheck returns the server's health status.
|
|
280
|
+
func (c *Client) Healthcheck(ctx context.Context) (*HealthcheckResult, error) {
|
|
281
|
+
resp, err := c.stub.Healthcheck(ctx, &pb.HealthcheckRequest{})
|
|
282
|
+
if err != nil {
|
|
283
|
+
return nil, err
|
|
284
|
+
}
|
|
285
|
+
return &HealthcheckResult{
|
|
286
|
+
Status: resp.Status,
|
|
287
|
+
UptimeSeconds: resp.UptimeSeconds,
|
|
288
|
+
LoadedIndexes: resp.LoadedIndexes,
|
|
289
|
+
}, nil
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Shutdown requests a graceful server shutdown.
|
|
293
|
+
func (c *Client) Shutdown(ctx context.Context) error {
|
|
294
|
+
_, err := c.stub.Shutdown(ctx, &pb.ShutdownRequest{})
|
|
295
|
+
return err
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ── Helpers ───────────────────────────────────────────
|
|
299
|
+
|
|
300
|
+
// MetaString creates a string metadata value.
|
|
301
|
+
func MetaString(s string) *pb.MetadataValue {
|
|
302
|
+
return &pb.MetadataValue{Value: &pb.MetadataValue_StringValue{StringValue: s}}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// MetaNumber creates a numeric metadata value.
|
|
306
|
+
func MetaNumber(n float64) *pb.MetadataValue {
|
|
307
|
+
return &pb.MetadataValue{Value: &pb.MetadataValue_NumberValue{NumberValue: n}}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// MetaBool creates a boolean metadata value.
|
|
311
|
+
func MetaBool(b bool) *pb.MetadataValue {
|
|
312
|
+
return &pb.MetadataValue{Value: &pb.MetadataValue_BoolValue{BoolValue: b}}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// FilterJSON marshals a map into a JSON string suitable for filter parameters.
|
|
316
|
+
func FilterJSON(filter map[string]interface{}) (string, error) {
|
|
317
|
+
b, err := json.Marshal(filter)
|
|
318
|
+
if err != nil {
|
|
319
|
+
return "", fmt.Errorf("vectra: marshal filter: %w", err)
|
|
320
|
+
}
|
|
321
|
+
return string(b), nil
|
|
322
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Vectra Java Client
|
|
2
|
+
|
|
3
|
+
Thin idiomatic Java wrapper over the Vectra gRPC service.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Add gRPC dependencies to your build tool.
|
|
8
|
+
|
|
9
|
+
### Gradle
|
|
10
|
+
|
|
11
|
+
```groovy
|
|
12
|
+
plugins {
|
|
13
|
+
id 'com.google.protobuf' version '0.9.4'
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
dependencies {
|
|
17
|
+
implementation 'io.grpc:grpc-netty-shaded:1.65.0'
|
|
18
|
+
implementation 'io.grpc:grpc-protobuf:1.65.0'
|
|
19
|
+
implementation 'io.grpc:grpc-stub:1.65.0'
|
|
20
|
+
compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protobuf {
|
|
24
|
+
protoc { artifact = 'com.google.protobuf:protoc:3.25.3' }
|
|
25
|
+
plugins {
|
|
26
|
+
grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.65.0' }
|
|
27
|
+
}
|
|
28
|
+
generateProtoTasks {
|
|
29
|
+
all()*.plugins { grpc {} }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Maven
|
|
35
|
+
|
|
36
|
+
```xml
|
|
37
|
+
<dependencies>
|
|
38
|
+
<dependency>
|
|
39
|
+
<groupId>io.grpc</groupId>
|
|
40
|
+
<artifactId>grpc-netty-shaded</artifactId>
|
|
41
|
+
<version>1.65.0</version>
|
|
42
|
+
</dependency>
|
|
43
|
+
<dependency>
|
|
44
|
+
<groupId>io.grpc</groupId>
|
|
45
|
+
<artifactId>grpc-protobuf</artifactId>
|
|
46
|
+
<version>1.65.0</version>
|
|
47
|
+
</dependency>
|
|
48
|
+
<dependency>
|
|
49
|
+
<groupId>io.grpc</groupId>
|
|
50
|
+
<artifactId>grpc-stub</artifactId>
|
|
51
|
+
<version>1.65.0</version>
|
|
52
|
+
</dependency>
|
|
53
|
+
</dependencies>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Generate gRPC stubs
|
|
57
|
+
|
|
58
|
+
Place `vectra_service.proto` in `src/main/proto/`. With the Gradle protobuf plugin or Maven gRPC plugin, stubs are generated automatically at build time.
|
|
59
|
+
|
|
60
|
+
## Usage
|
|
61
|
+
|
|
62
|
+
```java
|
|
63
|
+
import io.github.vectra.client.VectraClient;
|
|
64
|
+
|
|
65
|
+
try (VectraClient client = new VectraClient()) {
|
|
66
|
+
// Create a document index
|
|
67
|
+
client.createIndex("my-index", "json", true, 512, 0);
|
|
68
|
+
|
|
69
|
+
// Add a document
|
|
70
|
+
client.upsertDocument("my-index", "doc1.txt", "Hello world...");
|
|
71
|
+
|
|
72
|
+
// Query
|
|
73
|
+
var results = client.queryDocuments("my-index", "hello");
|
|
74
|
+
for (var doc : results) {
|
|
75
|
+
System.out.printf("%s (score: %.3f)%n", doc.getUri(), doc.getScore());
|
|
76
|
+
for (var chunk : doc.getChunksList()) {
|
|
77
|
+
System.out.printf(" %s...%n", chunk.getText().substring(0, Math.min(80, chunk.getText().length())));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|