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,232 @@
|
|
|
1
|
+
// Vectra gRPC client — thin idiomatic wrapper over generated stubs.
|
|
2
|
+
//
|
|
3
|
+
// Usage:
|
|
4
|
+
// try (VectraClient client = new VectraClient()) {
|
|
5
|
+
// List<DocumentResult> results = client.queryDocuments("my-index", "search query");
|
|
6
|
+
// }
|
|
7
|
+
//
|
|
8
|
+
// Generate stubs first (see README.md).
|
|
9
|
+
|
|
10
|
+
package io.github.vectra.client;
|
|
11
|
+
|
|
12
|
+
import com.google.protobuf.util.JsonFormat;
|
|
13
|
+
import io.grpc.ManagedChannel;
|
|
14
|
+
import io.grpc.ManagedChannelBuilder;
|
|
15
|
+
import vectra.VectraServiceGrpc;
|
|
16
|
+
import vectra.VectraServiceProto.*;
|
|
17
|
+
|
|
18
|
+
import java.util.*;
|
|
19
|
+
import java.util.concurrent.TimeUnit;
|
|
20
|
+
import java.util.stream.Collectors;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Idiomatic Java client for the Vectra gRPC server.
|
|
24
|
+
*/
|
|
25
|
+
public class VectraClient implements AutoCloseable {
|
|
26
|
+
private final ManagedChannel channel;
|
|
27
|
+
private final VectraServiceGrpc.VectraServiceBlockingStub stub;
|
|
28
|
+
|
|
29
|
+
public VectraClient() {
|
|
30
|
+
this("127.0.0.1", 50051);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public VectraClient(String host, int port) {
|
|
34
|
+
this.channel = ManagedChannelBuilder.forAddress(host, port)
|
|
35
|
+
.usePlaintext()
|
|
36
|
+
.build();
|
|
37
|
+
this.stub = VectraServiceGrpc.newBlockingStub(channel);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@Override
|
|
41
|
+
public void close() {
|
|
42
|
+
try {
|
|
43
|
+
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
|
|
44
|
+
} catch (InterruptedException e) {
|
|
45
|
+
channel.shutdownNow();
|
|
46
|
+
Thread.currentThread().interrupt();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ── Index Management ──────────────────────────────────
|
|
51
|
+
|
|
52
|
+
public void createIndex(String name) {
|
|
53
|
+
createIndex(name, "json", false, 512, 0);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public void createIndex(String name, String format, boolean isDocumentIndex,
|
|
57
|
+
int chunkSize, int chunkOverlap) {
|
|
58
|
+
CreateIndexRequest.Builder req = CreateIndexRequest.newBuilder()
|
|
59
|
+
.setIndexName(name)
|
|
60
|
+
.setFormat(format)
|
|
61
|
+
.setIsDocumentIndex(isDocumentIndex);
|
|
62
|
+
if (isDocumentIndex) {
|
|
63
|
+
req.setDocumentConfig(DocumentIndexConfig.newBuilder()
|
|
64
|
+
.setVersion(1)
|
|
65
|
+
.setChunkSize(chunkSize)
|
|
66
|
+
.setChunkOverlap(chunkOverlap)
|
|
67
|
+
.build());
|
|
68
|
+
}
|
|
69
|
+
stub.createIndex(req.build());
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public void deleteIndex(String name) {
|
|
73
|
+
stub.deleteIndex(DeleteIndexRequest.newBuilder().setIndexName(name).build());
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public List<IndexInfo> listIndexes() {
|
|
77
|
+
ListIndexesResponse resp = stub.listIndexes(ListIndexesRequest.getDefaultInstance());
|
|
78
|
+
return resp.getIndexesList();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ── Item Operations ───────────────────────────────────
|
|
82
|
+
|
|
83
|
+
public String insertItem(String index, String text) {
|
|
84
|
+
return insertItem(index, text, null, null, "");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public String insertItem(String index, String text, List<Float> vector,
|
|
88
|
+
Map<String, MetadataValue> metadata, String id) {
|
|
89
|
+
InsertItemRequest.Builder req = InsertItemRequest.newBuilder()
|
|
90
|
+
.setIndexName(index)
|
|
91
|
+
.setText(text)
|
|
92
|
+
.setId(id != null ? id : "");
|
|
93
|
+
if (vector != null) req.addAllVector(vector);
|
|
94
|
+
if (metadata != null) req.putAllMetadata(metadata);
|
|
95
|
+
return stub.insertItem(req.build()).getId();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public String upsertItem(String index, String id, String text, List<Float> vector,
|
|
99
|
+
Map<String, MetadataValue> metadata) {
|
|
100
|
+
UpsertItemRequest.Builder req = UpsertItemRequest.newBuilder()
|
|
101
|
+
.setIndexName(index)
|
|
102
|
+
.setId(id)
|
|
103
|
+
.setText(text);
|
|
104
|
+
if (vector != null) req.addAllVector(vector);
|
|
105
|
+
if (metadata != null) req.putAllMetadata(metadata);
|
|
106
|
+
return stub.upsertItem(req.build()).getId();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public ItemResult getItem(String index, String id) {
|
|
110
|
+
GetItemResponse resp = stub.getItem(
|
|
111
|
+
GetItemRequest.newBuilder().setIndexName(index).setId(id).build());
|
|
112
|
+
return resp.hasItem() ? resp.getItem() : null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public void deleteItem(String index, String id) {
|
|
116
|
+
stub.deleteItem(DeleteItemRequest.newBuilder().setIndexName(index).setId(id).build());
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public List<ItemResult> listItems(String index) {
|
|
120
|
+
return listItems(index, null);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public List<ItemResult> listItems(String index, String filterJson) {
|
|
124
|
+
ListItemsRequest.Builder req = ListItemsRequest.newBuilder().setIndexName(index);
|
|
125
|
+
if (filterJson != null && !filterJson.isEmpty()) {
|
|
126
|
+
req.setFilter(MetadataFilter.newBuilder().setFilterJson(filterJson).build());
|
|
127
|
+
}
|
|
128
|
+
return stub.listItems(req.build()).getItemsList();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ── Query ─────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
public List<ItemResult> queryItems(String index, String text, int topK) {
|
|
134
|
+
return queryItems(index, text, topK, null);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public List<ItemResult> queryItems(String index, String text, int topK, String filterJson) {
|
|
138
|
+
QueryItemsRequest.Builder req = QueryItemsRequest.newBuilder()
|
|
139
|
+
.setIndexName(index)
|
|
140
|
+
.setText(text)
|
|
141
|
+
.setTopK(topK);
|
|
142
|
+
if (filterJson != null && !filterJson.isEmpty()) {
|
|
143
|
+
req.setFilter(MetadataFilter.newBuilder().setFilterJson(filterJson).build());
|
|
144
|
+
}
|
|
145
|
+
return stub.queryItems(req.build()).getResultsList();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public List<DocumentResult> queryDocuments(String index, String query) {
|
|
149
|
+
return queryDocuments(index, query, 10, 50, null, false);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public List<DocumentResult> queryDocuments(String index, String query,
|
|
153
|
+
int maxDocuments, int maxChunks,
|
|
154
|
+
String filterJson, boolean useBm25) {
|
|
155
|
+
QueryDocumentsRequest.Builder req = QueryDocumentsRequest.newBuilder()
|
|
156
|
+
.setIndexName(index)
|
|
157
|
+
.setQuery(query)
|
|
158
|
+
.setMaxDocuments(maxDocuments)
|
|
159
|
+
.setMaxChunks(maxChunks)
|
|
160
|
+
.setUseBm25(useBm25);
|
|
161
|
+
if (filterJson != null && !filterJson.isEmpty()) {
|
|
162
|
+
req.setFilter(MetadataFilter.newBuilder().setFilterJson(filterJson).build());
|
|
163
|
+
}
|
|
164
|
+
return stub.queryDocuments(req.build()).getResultsList();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ── Document Operations ───────────────────────────────
|
|
168
|
+
|
|
169
|
+
public String upsertDocument(String index, String uri, String text) {
|
|
170
|
+
return upsertDocument(index, uri, text, "", null);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public String upsertDocument(String index, String uri, String text,
|
|
174
|
+
String docType, Map<String, MetadataValue> metadata) {
|
|
175
|
+
UpsertDocumentRequest.Builder req = UpsertDocumentRequest.newBuilder()
|
|
176
|
+
.setIndexName(index)
|
|
177
|
+
.setUri(uri)
|
|
178
|
+
.setText(text)
|
|
179
|
+
.setDocType(docType != null ? docType : "");
|
|
180
|
+
if (metadata != null) req.putAllMetadata(metadata);
|
|
181
|
+
return stub.upsertDocument(req.build()).getDocumentId();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public void deleteDocument(String index, String uri) {
|
|
185
|
+
stub.deleteDocument(DeleteDocumentRequest.newBuilder()
|
|
186
|
+
.setIndexName(index).setUri(uri).build());
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
public List<DocumentInfo> listDocuments(String index) {
|
|
190
|
+
return stub.listDocuments(ListDocumentsRequest.newBuilder()
|
|
191
|
+
.setIndexName(index).build()).getDocumentsList();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ── Stats ─────────────────────────────────────────────
|
|
195
|
+
|
|
196
|
+
public GetIndexStatsResponse getIndexStats(String index) {
|
|
197
|
+
return stub.getIndexStats(
|
|
198
|
+
GetIndexStatsRequest.newBuilder().setIndexName(index).build());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
public GetCatalogStatsResponse getCatalogStats(String index) {
|
|
202
|
+
return stub.getCatalogStats(
|
|
203
|
+
GetCatalogStatsRequest.newBuilder().setIndexName(index).build());
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ── Lifecycle ─────────────────────────────────────────
|
|
207
|
+
|
|
208
|
+
public HealthcheckResponse healthcheck() {
|
|
209
|
+
return stub.healthcheck(HealthcheckRequest.getDefaultInstance());
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public void shutdown() {
|
|
213
|
+
stub.shutdown(ShutdownRequest.getDefaultInstance());
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ── Helpers ───────────────────────────────────────────
|
|
217
|
+
|
|
218
|
+
/** Create a string metadata value. */
|
|
219
|
+
public static MetadataValue metaString(String s) {
|
|
220
|
+
return MetadataValue.newBuilder().setStringValue(s).build();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** Create a numeric metadata value. */
|
|
224
|
+
public static MetadataValue metaNumber(double n) {
|
|
225
|
+
return MetadataValue.newBuilder().setNumberValue(n).build();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Create a boolean metadata value. */
|
|
229
|
+
public static MetadataValue metaBool(boolean b) {
|
|
230
|
+
return MetadataValue.newBuilder().setBoolValue(b).build();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Vectra Python Client
|
|
2
|
+
|
|
3
|
+
Thin idiomatic Python wrapper over the Vectra gRPC service.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install grpcio grpcio-tools
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Generate gRPC stubs
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. vectra_service.proto
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This produces `vectra_service_pb2.py` and `vectra_service_pb2_grpc.py`.
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from vectra_client import VectraClient
|
|
23
|
+
|
|
24
|
+
with VectraClient() as client:
|
|
25
|
+
# Create a document index
|
|
26
|
+
client.create_index("my-index", is_document_index=True)
|
|
27
|
+
|
|
28
|
+
# Add a document
|
|
29
|
+
client.upsert_document("my-index", "doc1.txt", "Hello world...")
|
|
30
|
+
|
|
31
|
+
# Query
|
|
32
|
+
results = client.query_documents("my-index", "hello")
|
|
33
|
+
for doc in results:
|
|
34
|
+
print(f"{doc['uri']} (score: {doc['score']:.3f})")
|
|
35
|
+
for chunk in doc["chunks"]:
|
|
36
|
+
print(f" {chunk['text'][:80]}...")
|
|
37
|
+
```
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"""Vectra gRPC client — thin idiomatic wrapper over generated stubs.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
from vectra_client import VectraClient
|
|
5
|
+
|
|
6
|
+
client = VectraClient() # localhost:50051
|
|
7
|
+
results = client.query_documents("my-index", "search query")
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
import grpc
|
|
16
|
+
|
|
17
|
+
# Generated stubs — run `python -m grpc_tools.protoc` to produce these:
|
|
18
|
+
# python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. vectra_service.proto
|
|
19
|
+
import vectra_service_pb2 as pb2
|
|
20
|
+
import vectra_service_pb2_grpc as pb2_grpc
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class VectraClient:
|
|
24
|
+
"""Idiomatic Python client for the Vectra gRPC server."""
|
|
25
|
+
|
|
26
|
+
def __init__(self, host: str = "127.0.0.1", port: int = 50051):
|
|
27
|
+
self._channel = grpc.insecure_channel(f"{host}:{port}")
|
|
28
|
+
self._stub = pb2_grpc.VectraServiceStub(self._channel)
|
|
29
|
+
|
|
30
|
+
def close(self) -> None:
|
|
31
|
+
self._channel.close()
|
|
32
|
+
|
|
33
|
+
def __enter__(self) -> VectraClient:
|
|
34
|
+
return self
|
|
35
|
+
|
|
36
|
+
def __exit__(self, *_: Any) -> None:
|
|
37
|
+
self.close()
|
|
38
|
+
|
|
39
|
+
# ── Index Management ──────────────────────────────────
|
|
40
|
+
|
|
41
|
+
def create_index(
|
|
42
|
+
self,
|
|
43
|
+
name: str,
|
|
44
|
+
*,
|
|
45
|
+
format: str = "json",
|
|
46
|
+
is_document_index: bool = False,
|
|
47
|
+
chunk_size: int = 512,
|
|
48
|
+
chunk_overlap: int = 0,
|
|
49
|
+
) -> None:
|
|
50
|
+
doc_config = pb2.DocumentIndexConfig(
|
|
51
|
+
version=1,
|
|
52
|
+
chunk_size=chunk_size,
|
|
53
|
+
chunk_overlap=chunk_overlap,
|
|
54
|
+
) if is_document_index else None
|
|
55
|
+
self._stub.CreateIndex(pb2.CreateIndexRequest(
|
|
56
|
+
index_name=name,
|
|
57
|
+
format=format,
|
|
58
|
+
is_document_index=is_document_index,
|
|
59
|
+
document_config=doc_config,
|
|
60
|
+
))
|
|
61
|
+
|
|
62
|
+
def delete_index(self, name: str) -> None:
|
|
63
|
+
self._stub.DeleteIndex(pb2.DeleteIndexRequest(index_name=name))
|
|
64
|
+
|
|
65
|
+
def list_indexes(self) -> list[dict[str, Any]]:
|
|
66
|
+
resp = self._stub.ListIndexes(pb2.ListIndexesRequest())
|
|
67
|
+
return [
|
|
68
|
+
{"name": idx.name, "format": idx.format, "is_document_index": idx.is_document_index}
|
|
69
|
+
for idx in resp.indexes
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
# ── Item Operations ───────────────────────────────────
|
|
73
|
+
|
|
74
|
+
def insert_item(
|
|
75
|
+
self,
|
|
76
|
+
index: str,
|
|
77
|
+
*,
|
|
78
|
+
text: str = "",
|
|
79
|
+
vector: list[float] | None = None,
|
|
80
|
+
metadata: dict[str, Any] | None = None,
|
|
81
|
+
id: str = "",
|
|
82
|
+
) -> str:
|
|
83
|
+
req = pb2.InsertItemRequest(
|
|
84
|
+
index_name=index,
|
|
85
|
+
text=text,
|
|
86
|
+
id=id,
|
|
87
|
+
)
|
|
88
|
+
if vector:
|
|
89
|
+
req.vector.extend(vector)
|
|
90
|
+
if metadata:
|
|
91
|
+
_set_metadata(req.metadata, metadata)
|
|
92
|
+
return self._stub.InsertItem(req).id
|
|
93
|
+
|
|
94
|
+
def upsert_item(
|
|
95
|
+
self,
|
|
96
|
+
index: str,
|
|
97
|
+
id: str,
|
|
98
|
+
*,
|
|
99
|
+
text: str = "",
|
|
100
|
+
vector: list[float] | None = None,
|
|
101
|
+
metadata: dict[str, Any] | None = None,
|
|
102
|
+
) -> str:
|
|
103
|
+
req = pb2.UpsertItemRequest(
|
|
104
|
+
index_name=index,
|
|
105
|
+
id=id,
|
|
106
|
+
text=text,
|
|
107
|
+
)
|
|
108
|
+
if vector:
|
|
109
|
+
req.vector.extend(vector)
|
|
110
|
+
if metadata:
|
|
111
|
+
_set_metadata(req.metadata, metadata)
|
|
112
|
+
return self._stub.UpsertItem(req).id
|
|
113
|
+
|
|
114
|
+
def get_item(self, index: str, id: str) -> dict[str, Any] | None:
|
|
115
|
+
resp = self._stub.GetItem(pb2.GetItemRequest(index_name=index, id=id))
|
|
116
|
+
return _item_to_dict(resp.item) if resp.HasField("item") else None
|
|
117
|
+
|
|
118
|
+
def delete_item(self, index: str, id: str) -> None:
|
|
119
|
+
self._stub.DeleteItem(pb2.DeleteItemRequest(index_name=index, id=id))
|
|
120
|
+
|
|
121
|
+
def list_items(
|
|
122
|
+
self, index: str, *, filter: dict[str, Any] | None = None
|
|
123
|
+
) -> list[dict[str, Any]]:
|
|
124
|
+
req = pb2.ListItemsRequest(index_name=index)
|
|
125
|
+
if filter:
|
|
126
|
+
req.filter.CopyFrom(pb2.MetadataFilter(filter_json=json.dumps(filter)))
|
|
127
|
+
resp = self._stub.ListItems(req)
|
|
128
|
+
return [_item_to_dict(item) for item in resp.items]
|
|
129
|
+
|
|
130
|
+
# ── Query ─────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
def query_items(
|
|
133
|
+
self,
|
|
134
|
+
index: str,
|
|
135
|
+
*,
|
|
136
|
+
text: str = "",
|
|
137
|
+
vector: list[float] | None = None,
|
|
138
|
+
top_k: int = 10,
|
|
139
|
+
filter: dict[str, Any] | None = None,
|
|
140
|
+
) -> list[dict[str, Any]]:
|
|
141
|
+
req = pb2.QueryItemsRequest(
|
|
142
|
+
index_name=index,
|
|
143
|
+
text=text,
|
|
144
|
+
top_k=top_k,
|
|
145
|
+
)
|
|
146
|
+
if vector:
|
|
147
|
+
req.vector.extend(vector)
|
|
148
|
+
if filter:
|
|
149
|
+
req.filter.CopyFrom(pb2.MetadataFilter(filter_json=json.dumps(filter)))
|
|
150
|
+
resp = self._stub.QueryItems(req)
|
|
151
|
+
return [_item_to_dict(r) for r in resp.results]
|
|
152
|
+
|
|
153
|
+
def query_documents(
|
|
154
|
+
self,
|
|
155
|
+
index: str,
|
|
156
|
+
query: str,
|
|
157
|
+
*,
|
|
158
|
+
max_documents: int = 10,
|
|
159
|
+
max_chunks: int = 50,
|
|
160
|
+
filter: dict[str, Any] | None = None,
|
|
161
|
+
use_bm25: bool = False,
|
|
162
|
+
) -> list[dict[str, Any]]:
|
|
163
|
+
req = pb2.QueryDocumentsRequest(
|
|
164
|
+
index_name=index,
|
|
165
|
+
query=query,
|
|
166
|
+
max_documents=max_documents,
|
|
167
|
+
max_chunks=max_chunks,
|
|
168
|
+
use_bm25=use_bm25,
|
|
169
|
+
)
|
|
170
|
+
if filter:
|
|
171
|
+
req.filter.CopyFrom(pb2.MetadataFilter(filter_json=json.dumps(filter)))
|
|
172
|
+
resp = self._stub.QueryDocuments(req)
|
|
173
|
+
return [
|
|
174
|
+
{
|
|
175
|
+
"uri": doc.uri,
|
|
176
|
+
"document_id": doc.document_id,
|
|
177
|
+
"score": doc.score,
|
|
178
|
+
"chunks": [
|
|
179
|
+
{"text": c.text, "score": c.score, "token_count": c.token_count}
|
|
180
|
+
for c in doc.chunks
|
|
181
|
+
],
|
|
182
|
+
}
|
|
183
|
+
for doc in resp.results
|
|
184
|
+
]
|
|
185
|
+
|
|
186
|
+
# ── Document Operations ───────────────────────────────
|
|
187
|
+
|
|
188
|
+
def upsert_document(
|
|
189
|
+
self,
|
|
190
|
+
index: str,
|
|
191
|
+
uri: str,
|
|
192
|
+
text: str,
|
|
193
|
+
*,
|
|
194
|
+
doc_type: str = "",
|
|
195
|
+
metadata: dict[str, Any] | None = None,
|
|
196
|
+
) -> str:
|
|
197
|
+
req = pb2.UpsertDocumentRequest(
|
|
198
|
+
index_name=index,
|
|
199
|
+
uri=uri,
|
|
200
|
+
text=text,
|
|
201
|
+
doc_type=doc_type,
|
|
202
|
+
)
|
|
203
|
+
if metadata:
|
|
204
|
+
_set_metadata(req.metadata, metadata)
|
|
205
|
+
return self._stub.UpsertDocument(req).document_id
|
|
206
|
+
|
|
207
|
+
def delete_document(self, index: str, uri: str) -> None:
|
|
208
|
+
self._stub.DeleteDocument(pb2.DeleteDocumentRequest(index_name=index, uri=uri))
|
|
209
|
+
|
|
210
|
+
def list_documents(self, index: str) -> list[dict[str, Any]]:
|
|
211
|
+
resp = self._stub.ListDocuments(pb2.ListDocumentsRequest(index_name=index))
|
|
212
|
+
return [{"uri": d.uri, "document_id": d.document_id} for d in resp.documents]
|
|
213
|
+
|
|
214
|
+
# ── Stats ─────────────────────────────────────────────
|
|
215
|
+
|
|
216
|
+
def get_index_stats(self, index: str) -> dict[str, Any]:
|
|
217
|
+
resp = self._stub.GetIndexStats(pb2.GetIndexStatsRequest(index_name=index))
|
|
218
|
+
return {
|
|
219
|
+
"version": resp.version,
|
|
220
|
+
"format": resp.format,
|
|
221
|
+
"item_count": resp.item_count,
|
|
222
|
+
"metadata_config_count": resp.metadata_config_count,
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
def get_catalog_stats(self, index: str) -> dict[str, Any]:
|
|
226
|
+
resp = self._stub.GetCatalogStats(pb2.GetCatalogStatsRequest(index_name=index))
|
|
227
|
+
return {
|
|
228
|
+
"version": resp.version,
|
|
229
|
+
"document_count": resp.document_count,
|
|
230
|
+
"chunk_count": resp.chunk_count,
|
|
231
|
+
"metadata_counts": dict(resp.metadata_counts),
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
# ── Lifecycle ─────────────────────────────────────────
|
|
235
|
+
|
|
236
|
+
def healthcheck(self) -> dict[str, Any]:
|
|
237
|
+
resp = self._stub.Healthcheck(pb2.HealthcheckRequest())
|
|
238
|
+
return {
|
|
239
|
+
"status": resp.status,
|
|
240
|
+
"uptime_seconds": resp.uptime_seconds,
|
|
241
|
+
"loaded_indexes": resp.loaded_indexes,
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
def shutdown(self) -> None:
|
|
245
|
+
self._stub.Shutdown(pb2.ShutdownRequest())
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
# ── Helpers ───────────────────────────────────────────────
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def _set_metadata(
|
|
252
|
+
proto_map: Any, metadata: dict[str, Any]
|
|
253
|
+
) -> None:
|
|
254
|
+
for key, value in metadata.items():
|
|
255
|
+
if isinstance(value, bool):
|
|
256
|
+
proto_map[key].CopyFrom(pb2.MetadataValue(bool_value=value))
|
|
257
|
+
elif isinstance(value, (int, float)):
|
|
258
|
+
proto_map[key].CopyFrom(pb2.MetadataValue(number_value=value))
|
|
259
|
+
else:
|
|
260
|
+
proto_map[key].CopyFrom(pb2.MetadataValue(string_value=str(value)))
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _item_to_dict(item: Any) -> dict[str, Any]:
|
|
264
|
+
metadata: dict[str, Any] = {}
|
|
265
|
+
for key, val in item.metadata.items():
|
|
266
|
+
which = val.WhichOneof("value")
|
|
267
|
+
if which == "string_value":
|
|
268
|
+
metadata[key] = val.string_value
|
|
269
|
+
elif which == "number_value":
|
|
270
|
+
metadata[key] = val.number_value
|
|
271
|
+
elif which == "bool_value":
|
|
272
|
+
metadata[key] = val.bool_value
|
|
273
|
+
return {
|
|
274
|
+
"id": item.id,
|
|
275
|
+
"metadata": metadata,
|
|
276
|
+
"vector": list(item.vector),
|
|
277
|
+
"norm": item.norm,
|
|
278
|
+
"score": item.score,
|
|
279
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "vectra-client"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
description = "Vectra gRPC client for Rust"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
|
|
8
|
+
[dependencies]
|
|
9
|
+
tonic = "0.12"
|
|
10
|
+
prost = "0.13"
|
|
11
|
+
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
|
|
12
|
+
|
|
13
|
+
[build-dependencies]
|
|
14
|
+
tonic-build = "0.12"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Vectra Rust Client
|
|
2
|
+
|
|
3
|
+
Thin idiomatic Rust wrapper over the Vectra gRPC service.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Rust toolchain (`rustup`)
|
|
8
|
+
- `protoc` (Protocol Buffers compiler) — install via your package manager
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
1. Copy the generated files (`vectra_service.proto`, `build.rs`, `Cargo.toml`, `lib.rs`) into your project.
|
|
13
|
+
2. Place `vectra_service.proto` in the crate root (next to `Cargo.toml`).
|
|
14
|
+
3. `tonic-build` in `build.rs` generates the stubs at compile time.
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```rust
|
|
19
|
+
use vectra_client::VectraClient;
|
|
20
|
+
|
|
21
|
+
#[tokio::main]
|
|
22
|
+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
23
|
+
let mut client = VectraClient::connect("http://127.0.0.1:50051").await?;
|
|
24
|
+
|
|
25
|
+
// Create a document index
|
|
26
|
+
client.create_index("my-index", "json", true).await?;
|
|
27
|
+
|
|
28
|
+
// Add a document
|
|
29
|
+
client.upsert_document("my-index", "doc1.txt", "Hello world...", None, None).await?;
|
|
30
|
+
|
|
31
|
+
// Query
|
|
32
|
+
let results = client.query_documents("my-index", "hello", None).await?;
|
|
33
|
+
for doc in &results {
|
|
34
|
+
println!("{} (score: {:.3})", doc.uri, doc.score);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
Ok(())
|
|
38
|
+
}
|
|
39
|
+
```
|