vector-inspector 0.3.4__tar.gz → 0.3.6__tar.gz
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.
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/PKG-INFO +7 -6
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/README.md +4 -5
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/pyproject.toml +3 -1
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/base_connection.py +86 -1
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/chroma_connection.py +23 -3
- vector_inspector-0.3.6/src/vector_inspector/core/connections/pgvector_connection.py +1100 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/pinecone_connection.py +24 -4
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/qdrant_connection.py +224 -189
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/embedding_providers/provider_factory.py +33 -38
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/embedding_utils.py +2 -2
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/backup_restore_service.py +41 -33
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/connection_manager_panel.py +96 -77
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/profile_manager_panel.py +315 -121
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/dialogs/embedding_config_dialog.py +79 -58
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/main_window.py +22 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/connection_view.py +215 -116
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/info_panel.py +6 -6
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/metadata_view.py +466 -187
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/__main__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/config/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/config/known_embedding_models.json +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/cache_manager.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connection_manager.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/qdrant_helpers/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/qdrant_helpers/qdrant_embedding_resolver.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/qdrant_helpers/qdrant_filter_builder.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/connections/template_connection.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/embedding_providers/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/embedding_providers/base_provider.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/embedding_providers/clip_provider.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/embedding_providers/sentence_transformer_provider.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/logging.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/core/model_registry.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/main.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/backup_helpers.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/credential_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/filter_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/import_export_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/profile_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/settings_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/services/visualization_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/backup_restore_dialog.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/filter_builder.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/item_dialog.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/loading_dialog.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/components/splash_window.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/dialogs/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/dialogs/cross_db_migration.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/dialogs/provider_type_dialog.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/collection_browser.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/search_view.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/ui/views/visualization_view.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/utils/__init__.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/utils/lazy_imports.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/src/vector_inspector/utils/version.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_backup_helpers.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_backup_restore_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_connections.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_filter_service.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_pinecone_connection.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_runner.py +0 -0
- {vector_inspector-0.3.4 → vector_inspector-0.3.6}/tests/test_settings_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vector-inspector
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: A comprehensive desktop application for visualizing, querying, and managing vector database data
|
|
5
5
|
Author-Email: Anthony Dawson <anthonypdawson+github@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -26,15 +26,16 @@ Requires-Dist: keyring>=25.7.0
|
|
|
26
26
|
Requires-Dist: hf-xet>=1.2.0
|
|
27
27
|
Requires-Dist: pymilvus>=2.6.6
|
|
28
28
|
Requires-Dist: lancedb>=0.27.0
|
|
29
|
+
Requires-Dist: psycopg2>=2.9.11
|
|
30
|
+
Requires-Dist: pgvector>=0.4.2
|
|
29
31
|
Description-Content-Type: text/markdown
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
|
|
33
|
+
# Latest updates
|
|
34
|
+
- Added Postgres (pgvector extension) support as a new vector database connection option.
|
|
35
|
+
- Fixed issue with embedding regeneration on add/edit
|
|
36
|
+
- Added option for editing items without regenerating embeddings
|
|
35
37
|
---
|
|
36
38
|
|
|
37
|
-
|
|
38
39
|
# Vector Inspector
|
|
39
40
|
|
|
40
41
|
> **Disclaimer:** This tool is currently under active development and is **not production ready**. Not all features have been thoroughly tested and code is released frequently. Use with caution in critical or production environments.
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
-
|
|
3
|
-
-
|
|
4
|
-
|
|
1
|
+
# Latest updates
|
|
2
|
+
- Added Postgres (pgvector extension) support as a new vector database connection option.
|
|
3
|
+
- Fixed issue with embedding regeneration on add/edit
|
|
4
|
+
- Added option for editing items without regenerating embeddings
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
# Vector Inspector
|
|
9
8
|
|
|
10
9
|
> **Disclaimer:** This tool is currently under active development and is **not production ready**. Not all features have been thoroughly tested and code is released frequently. Use with caution in critical or production environments.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vector-inspector"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.6"
|
|
4
4
|
description = "A comprehensive desktop application for visualizing, querying, and managing vector database data"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Anthony Dawson", email = "anthonypdawson+github@gmail.com" },
|
|
@@ -23,6 +23,8 @@ dependencies = [
|
|
|
23
23
|
"hf-xet>=1.2.0",
|
|
24
24
|
"pymilvus>=2.6.6",
|
|
25
25
|
"lancedb>=0.27.0",
|
|
26
|
+
"psycopg2>=2.9.11",
|
|
27
|
+
"pgvector>=0.4.2",
|
|
26
28
|
]
|
|
27
29
|
requires-python = ">=3.10,<3.14"
|
|
28
30
|
readme = "README.md"
|
|
@@ -261,7 +261,7 @@ class VectorDBConnection(ABC):
|
|
|
261
261
|
|
|
262
262
|
# Finally, check user settings (for collections we can't modify)
|
|
263
263
|
if connection_id:
|
|
264
|
-
from
|
|
264
|
+
from vector_inspector.services.settings_service import SettingsService
|
|
265
265
|
|
|
266
266
|
settings = SettingsService()
|
|
267
267
|
model_info = settings.get_embedding_model(connection_id, collection_name)
|
|
@@ -272,3 +272,88 @@ class VectorDBConnection(ABC):
|
|
|
272
272
|
except Exception as e:
|
|
273
273
|
log_error("Failed to get embedding model: %s", e)
|
|
274
274
|
return None
|
|
275
|
+
|
|
276
|
+
def load_embedding_model_for_collection(
|
|
277
|
+
self, collection_name: str, connection_id: Optional[str] = None
|
|
278
|
+
):
|
|
279
|
+
"""
|
|
280
|
+
Resolve and load an embedding model for a collection.
|
|
281
|
+
|
|
282
|
+
Resolution order:
|
|
283
|
+
1. User settings (SettingsService)
|
|
284
|
+
2. Collection metadata (get_collection_info)
|
|
285
|
+
3. Dimension-based registry (embedding_utils.get_embedding_model_for_dimension)
|
|
286
|
+
4. DEFAULT_MODEL
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
(loaded_model, model_name, model_type)
|
|
290
|
+
"""
|
|
291
|
+
try:
|
|
292
|
+
from vector_inspector.services.settings_service import SettingsService
|
|
293
|
+
from vector_inspector.core.embedding_utils import (
|
|
294
|
+
load_embedding_model,
|
|
295
|
+
get_embedding_model_for_dimension,
|
|
296
|
+
DEFAULT_MODEL,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
# 1) settings
|
|
300
|
+
if connection_id:
|
|
301
|
+
settings = SettingsService()
|
|
302
|
+
cfg = settings.get_embedding_model(connection_id, collection_name)
|
|
303
|
+
if cfg and cfg.get("model"):
|
|
304
|
+
model_name = cfg.get("model")
|
|
305
|
+
model_type = cfg.get("type", "sentence-transformer")
|
|
306
|
+
model = load_embedding_model(model_name, model_type)
|
|
307
|
+
return (model, model_name, model_type)
|
|
308
|
+
|
|
309
|
+
# 2) collection metadata
|
|
310
|
+
try:
|
|
311
|
+
info = self.get_collection_info(collection_name)
|
|
312
|
+
except Exception:
|
|
313
|
+
info = None
|
|
314
|
+
|
|
315
|
+
if info and info.get("embedding_model"):
|
|
316
|
+
model_name = info.get("embedding_model")
|
|
317
|
+
model_type = info.get("embedding_model_type", "sentence-transformer")
|
|
318
|
+
model = load_embedding_model(model_name, model_type)
|
|
319
|
+
return (model, model_name, model_type)
|
|
320
|
+
|
|
321
|
+
# 3) dimension based
|
|
322
|
+
if info and info.get("vector_dimension"):
|
|
323
|
+
try:
|
|
324
|
+
dim = int(info.get("vector_dimension"))
|
|
325
|
+
model, model_name, model_type = get_embedding_model_for_dimension(dim)
|
|
326
|
+
return (model, model_name, model_type)
|
|
327
|
+
except Exception:
|
|
328
|
+
pass
|
|
329
|
+
|
|
330
|
+
# 4) fallback
|
|
331
|
+
model_name, model_type = DEFAULT_MODEL
|
|
332
|
+
model = load_embedding_model(model_name, model_type)
|
|
333
|
+
return (model, model_name, model_type)
|
|
334
|
+
except Exception as e:
|
|
335
|
+
log_error("Failed to load embedding model for collection %s: %s", collection_name, e)
|
|
336
|
+
raise
|
|
337
|
+
|
|
338
|
+
def compute_embeddings_for_documents(
|
|
339
|
+
self, collection_name: str, documents: List[str], connection_id: Optional[str] = None
|
|
340
|
+
) -> List[List[float]]:
|
|
341
|
+
"""
|
|
342
|
+
Compute embeddings for a list of documents using the resolved model for the collection.
|
|
343
|
+
|
|
344
|
+
Returns a list of embedding vectors (one per document). If encoding fails,
|
|
345
|
+
raises an exception.
|
|
346
|
+
"""
|
|
347
|
+
model, model_name, model_type = self.load_embedding_model_for_collection(
|
|
348
|
+
collection_name, connection_id
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
# Use batch encoding when available (sentence-transformer), otherwise per-doc
|
|
352
|
+
if model_type != "clip":
|
|
353
|
+
# sentence-transformer-like models support batch encode
|
|
354
|
+
return model.encode(documents, show_progress_bar=False).tolist()
|
|
355
|
+
else:
|
|
356
|
+
# CLIP - use encode_text helper for each document
|
|
357
|
+
from vector_inspector.core.embedding_utils import encode_text
|
|
358
|
+
|
|
359
|
+
return [encode_text(d, model, model_type) for d in documents]
|
|
@@ -8,7 +8,7 @@ from chromadb.api import ClientAPI
|
|
|
8
8
|
from chromadb.api.models.Collection import Collection
|
|
9
9
|
from chromadb import Documents, EmbeddingFunction, Embeddings
|
|
10
10
|
|
|
11
|
-
from .base_connection import VectorDBConnection
|
|
11
|
+
from vector_inspector.core.connections.base_connection import VectorDBConnection
|
|
12
12
|
from vector_inspector.core.logging import log_info, log_error
|
|
13
13
|
|
|
14
14
|
|
|
@@ -28,7 +28,7 @@ class DimensionAwareEmbeddingFunction(EmbeddingFunction):
|
|
|
28
28
|
if self._initialized:
|
|
29
29
|
return
|
|
30
30
|
|
|
31
|
-
from
|
|
31
|
+
from vector_inspector.core.embedding_utils import get_embedding_model_for_dimension
|
|
32
32
|
|
|
33
33
|
log_info("[ChromaDB] Loading embedding model for %dd vectors...", self.expected_dimension)
|
|
34
34
|
self.model, self.model_name, self.model_type = get_embedding_model_for_dimension(
|
|
@@ -45,7 +45,7 @@ class DimensionAwareEmbeddingFunction(EmbeddingFunction):
|
|
|
45
45
|
def __call__(self, input: Documents) -> Embeddings:
|
|
46
46
|
"""Embed documents using the dimension-appropriate model."""
|
|
47
47
|
self._ensure_model_loaded()
|
|
48
|
-
from
|
|
48
|
+
from vector_inspector.core.embedding_utils import encode_text
|
|
49
49
|
|
|
50
50
|
embeddings = []
|
|
51
51
|
for text in input:
|
|
@@ -385,6 +385,16 @@ class ChromaDBConnection(VectorDBConnection):
|
|
|
385
385
|
return False
|
|
386
386
|
|
|
387
387
|
try:
|
|
388
|
+
# If embeddings not provided, compute using collection model
|
|
389
|
+
if not embeddings and documents:
|
|
390
|
+
try:
|
|
391
|
+
embeddings = self.compute_embeddings_for_documents(
|
|
392
|
+
collection_name, documents, getattr(self, "connection_id", None)
|
|
393
|
+
)
|
|
394
|
+
except Exception as e:
|
|
395
|
+
log_error("Failed to compute embeddings for Chroma add_items: %s", e)
|
|
396
|
+
return False
|
|
397
|
+
|
|
388
398
|
collection.add(
|
|
389
399
|
documents=documents,
|
|
390
400
|
metadatas=metadatas, # type: ignore
|
|
@@ -422,6 +432,16 @@ class ChromaDBConnection(VectorDBConnection):
|
|
|
422
432
|
return False
|
|
423
433
|
|
|
424
434
|
try:
|
|
435
|
+
# If embeddings not provided but documents changed, compute embeddings
|
|
436
|
+
if (not embeddings) and documents:
|
|
437
|
+
try:
|
|
438
|
+
embeddings = self.compute_embeddings_for_documents(
|
|
439
|
+
collection_name, documents, getattr(self, "connection_id", None)
|
|
440
|
+
)
|
|
441
|
+
except Exception as e:
|
|
442
|
+
log_error("Failed to compute embeddings for Chroma update_items: %s", e)
|
|
443
|
+
return False
|
|
444
|
+
|
|
425
445
|
collection.update(
|
|
426
446
|
ids=ids,
|
|
427
447
|
documents=documents,
|