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,169 @@
|
|
|
1
|
+
import { FileDetails, FileStorage, ListFilesFilter } from "./FileStorage";
|
|
2
|
+
import { pathUtils as path } from '../utils/pathUtils';
|
|
3
|
+
import { FileStorageUtilities } from "./FileStorageUtilities";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* An in-memory `FileStorage` implementation.
|
|
7
|
+
*/
|
|
8
|
+
export class VirtualFileStorage implements FileStorage {
|
|
9
|
+
private readonly _entries: Map<string, StoredFile> = new Map();
|
|
10
|
+
|
|
11
|
+
// Normalize keys consistently across all operations:
|
|
12
|
+
// - path.normalize to resolve dot segments
|
|
13
|
+
// - remove trailing separator (except for root) so 'a' and 'a/' match
|
|
14
|
+
// - preserve '' to represent the root namespace in this storage
|
|
15
|
+
private normalizeKey(key: string): string {
|
|
16
|
+
if (key.length === 0) return "";
|
|
17
|
+
let normalized = path.normalize(key);
|
|
18
|
+
if (normalized.endsWith(path.sep) && normalized !== path.sep) {
|
|
19
|
+
normalized = normalized.slice(0, -1);
|
|
20
|
+
}
|
|
21
|
+
return normalized;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public async createFile(filePath: string, content: Buffer | string): Promise<void> {
|
|
25
|
+
const key = this.normalizeKey(filePath);
|
|
26
|
+
if (this._entries.has(key)) {
|
|
27
|
+
throw new Error(`File already exists: ${key}`);
|
|
28
|
+
}
|
|
29
|
+
const buffer = typeof content === "string" ? Buffer.from(content, "utf8") : content;
|
|
30
|
+
this._entries.set(key, {
|
|
31
|
+
details: {
|
|
32
|
+
name: path.basename(key),
|
|
33
|
+
path: key,
|
|
34
|
+
isFolder: false,
|
|
35
|
+
fileType: FileStorageUtilities.getFileType(key),
|
|
36
|
+
},
|
|
37
|
+
// Clone to avoid external mutation of stored buffers (and keep Buffer type)
|
|
38
|
+
content: Buffer.from(buffer),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public async createFolder(folderPath: string): Promise<void> {
|
|
43
|
+
const key = this.normalizeKey(folderPath);
|
|
44
|
+
const existing = this._entries.get(key);
|
|
45
|
+
if (existing) {
|
|
46
|
+
if (!existing.details.isFolder) {
|
|
47
|
+
throw new Error(`Cannot create folder: ${key} is a file`);
|
|
48
|
+
}
|
|
49
|
+
// Idempotent if the folder already exists
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this._entries.set(key, {
|
|
53
|
+
details: {
|
|
54
|
+
name: path.basename(key),
|
|
55
|
+
path: key,
|
|
56
|
+
isFolder: true,
|
|
57
|
+
fileType: undefined,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public async deleteFile(filePath: string): Promise<void> {
|
|
63
|
+
const key = this.normalizeKey(filePath);
|
|
64
|
+
const existing = this._entries.get(key);
|
|
65
|
+
if (!existing) {
|
|
66
|
+
// no-op if not exists
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (existing.details.isFolder) {
|
|
70
|
+
throw new Error(`Cannot delete file: ${key} is a folder`);
|
|
71
|
+
}
|
|
72
|
+
this._entries.delete(key);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public async deleteFolder(folderPath: string): Promise<void> {
|
|
76
|
+
const key = this.normalizeKey(folderPath);
|
|
77
|
+
const existing = this._entries.get(key);
|
|
78
|
+
if (!existing) {
|
|
79
|
+
// no-op if not exists
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!existing.details.isFolder) {
|
|
83
|
+
throw new Error(`Cannot delete folder: ${key} is a file`);
|
|
84
|
+
}
|
|
85
|
+
// Note: does not cascade delete children per current implementation
|
|
86
|
+
this._entries.delete(key);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public async getDetails(fileOrFolderPath: string): Promise<FileDetails> {
|
|
90
|
+
const key = this.normalizeKey(fileOrFolderPath);
|
|
91
|
+
const existing = this._entries.get(key);
|
|
92
|
+
if (!existing) {
|
|
93
|
+
throw new Error(`Path not found: ${key}`);
|
|
94
|
+
}
|
|
95
|
+
// Return a shallow copy to avoid external mutation of returned metadata
|
|
96
|
+
return { ...existing.details };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public async listFiles(
|
|
100
|
+
folderPath: string,
|
|
101
|
+
filter: ListFilesFilter = "all"
|
|
102
|
+
): Promise<FileDetails[]> {
|
|
103
|
+
const baseFolder = this.normalizeKey(folderPath);
|
|
104
|
+
|
|
105
|
+
const results: FileDetails[] = [];
|
|
106
|
+
for (const [, entry] of this._entries) {
|
|
107
|
+
const parts = entry.details.path.split(path.sep);
|
|
108
|
+
const parentFolder =
|
|
109
|
+
parts.length > 1 ? parts.slice(0, parts.length - 1).join(path.sep) : "";
|
|
110
|
+
if (parentFolder === baseFolder) {
|
|
111
|
+
if (
|
|
112
|
+
filter === "all" ||
|
|
113
|
+
(filter === "files" && !entry.details.isFolder) ||
|
|
114
|
+
(filter === "folders" && entry.details.isFolder)
|
|
115
|
+
) {
|
|
116
|
+
// Return a shallow copy to avoid external mutation of returned metadata
|
|
117
|
+
results.push({ ...entry.details });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public async pathExists(fileOrFolderPath: string): Promise<boolean> {
|
|
125
|
+
const key = this.normalizeKey(fileOrFolderPath);
|
|
126
|
+
return this._entries.has(key);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public async readFile(filePath: string): Promise<Buffer> {
|
|
130
|
+
const key = this.normalizeKey(filePath);
|
|
131
|
+
const existing = this._entries.get(key);
|
|
132
|
+
if (!existing) {
|
|
133
|
+
throw new Error(`File not found: ${key}`);
|
|
134
|
+
}
|
|
135
|
+
if (existing.details.isFolder) {
|
|
136
|
+
throw new Error(`Cannot read file: ${key} is a folder`);
|
|
137
|
+
}
|
|
138
|
+
// Return a copy of the buffer to protect internal buffer from external mutation; fall back to empty buffer
|
|
139
|
+
const content = existing.content ?? Buffer.from("", "utf8");
|
|
140
|
+
return Buffer.from(content);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public async upsertFile(filePath: string, content: Buffer | string): Promise<void> {
|
|
144
|
+
const key = this.normalizeKey(filePath);
|
|
145
|
+
const existing = this._entries.get(key);
|
|
146
|
+
if (existing && existing.details.isFolder) {
|
|
147
|
+
throw new Error(`Cannot write file: ${key} is a folder`);
|
|
148
|
+
}
|
|
149
|
+
const buffer = typeof content === "string" ? Buffer.from(content, "utf8") : content;
|
|
150
|
+
this._entries.set(key, {
|
|
151
|
+
details: {
|
|
152
|
+
name: path.basename(key),
|
|
153
|
+
path: key,
|
|
154
|
+
isFolder: false,
|
|
155
|
+
fileType: FileStorageUtilities.getFileType(key),
|
|
156
|
+
},
|
|
157
|
+
// Clone to avoid external mutation of stored buffers (and keep Buffer type)
|
|
158
|
+
content: Buffer.from(buffer),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @private
|
|
165
|
+
*/
|
|
166
|
+
interface StoredFile {
|
|
167
|
+
details: FileDetails;
|
|
168
|
+
content?: Buffer;
|
|
169
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Vectra C# Client
|
|
2
|
+
|
|
3
|
+
Thin idiomatic C# wrapper over the Vectra gRPC service.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Add these NuGet packages to your project:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
dotnet add package Grpc.Net.Client
|
|
11
|
+
dotnet add package Google.Protobuf
|
|
12
|
+
dotnet add package Grpc.Tools
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Generate gRPC stubs
|
|
16
|
+
|
|
17
|
+
Add to your `.csproj`:
|
|
18
|
+
|
|
19
|
+
```xml
|
|
20
|
+
<ItemGroup>
|
|
21
|
+
<Protobuf Include="vectra_service.proto" GrpcServices="Client" />
|
|
22
|
+
</ItemGroup>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The stubs are generated automatically at build time by `Grpc.Tools`.
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```csharp
|
|
30
|
+
using Vectra.Client;
|
|
31
|
+
|
|
32
|
+
using var client = new VectraClient();
|
|
33
|
+
|
|
34
|
+
// Create a document index
|
|
35
|
+
await client.CreateIndexAsync("my-index", isDocumentIndex: true);
|
|
36
|
+
|
|
37
|
+
// Add a document
|
|
38
|
+
await client.UpsertDocumentAsync("my-index", "doc1.txt", "Hello world...");
|
|
39
|
+
|
|
40
|
+
// Query
|
|
41
|
+
var results = await client.QueryDocumentsAsync("my-index", "hello");
|
|
42
|
+
foreach (var doc in results)
|
|
43
|
+
{
|
|
44
|
+
Console.WriteLine($"{doc.Uri} (score: {doc.Score:F3})");
|
|
45
|
+
foreach (var chunk in doc.Chunks)
|
|
46
|
+
Console.WriteLine($" {chunk.Text[..Math.Min(80, chunk.Text.Length)]}...");
|
|
47
|
+
}
|
|
48
|
+
```
|
|
@@ -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
|
+
```
|