vector-inspector 0.2.5__py3-none-any.whl → 0.2.7__py3-none-any.whl
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/core/cache_manager.py +159 -0
- vector_inspector/core/connection_manager.py +277 -0
- vector_inspector/core/connections/chroma_connection.py +90 -5
- vector_inspector/core/connections/qdrant_connection.py +62 -8
- vector_inspector/core/embedding_utils.py +140 -0
- vector_inspector/services/backup_restore_service.py +3 -29
- vector_inspector/services/credential_service.py +130 -0
- vector_inspector/services/filter_service.py +1 -1
- vector_inspector/services/profile_service.py +409 -0
- vector_inspector/services/settings_service.py +20 -1
- vector_inspector/services/visualization_service.py +11 -7
- vector_inspector/ui/components/connection_manager_panel.py +320 -0
- vector_inspector/ui/components/profile_manager_panel.py +518 -0
- vector_inspector/ui/dialogs/__init__.py +5 -0
- vector_inspector/ui/dialogs/cross_db_migration.py +364 -0
- vector_inspector/ui/dialogs/embedding_config_dialog.py +176 -0
- vector_inspector/ui/main_window.py +429 -181
- vector_inspector/ui/views/connection_view.py +43 -8
- vector_inspector/ui/views/info_panel.py +226 -80
- vector_inspector/ui/views/metadata_view.py +136 -28
- vector_inspector/ui/views/search_view.py +43 -3
- {vector_inspector-0.2.5.dist-info → vector_inspector-0.2.7.dist-info}/METADATA +5 -3
- vector_inspector-0.2.7.dist-info/RECORD +45 -0
- vector_inspector-0.2.5.dist-info/RECORD +0 -35
- {vector_inspector-0.2.5.dist-info → vector_inspector-0.2.7.dist-info}/WHEEL +0 -0
- {vector_inspector-0.2.5.dist-info → vector_inspector-0.2.7.dist-info}/entry_points.txt +0 -0
|
@@ -7,7 +7,7 @@ from PySide6.QtWidgets import (
|
|
|
7
7
|
QLineEdit, QComboBox, QGroupBox, QHeaderView, QMessageBox, QDialog,
|
|
8
8
|
QFileDialog, QMenu
|
|
9
9
|
)
|
|
10
|
-
from PySide6.QtCore import Qt, QTimer
|
|
10
|
+
from PySide6.QtCore import Qt, QTimer, QThread, Signal
|
|
11
11
|
|
|
12
12
|
from vector_inspector.core.connections.base_connection import VectorDBConnection
|
|
13
13
|
from vector_inspector.ui.components.item_dialog import ItemDialog
|
|
@@ -16,9 +16,41 @@ from vector_inspector.ui.components.filter_builder import FilterBuilder
|
|
|
16
16
|
from vector_inspector.services.import_export_service import ImportExportService
|
|
17
17
|
from vector_inspector.services.filter_service import apply_client_side_filters
|
|
18
18
|
from vector_inspector.services.settings_service import SettingsService
|
|
19
|
+
from vector_inspector.core.cache_manager import get_cache_manager, CacheEntry
|
|
19
20
|
from PySide6.QtWidgets import QApplication
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
class DataLoadThread(QThread):
|
|
24
|
+
"""Background thread for loading collection data."""
|
|
25
|
+
|
|
26
|
+
finished = Signal(dict)
|
|
27
|
+
error = Signal(str)
|
|
28
|
+
|
|
29
|
+
def __init__(self, connection, collection, page_size, offset, server_filter):
|
|
30
|
+
super().__init__()
|
|
31
|
+
self.connection = connection
|
|
32
|
+
self.collection = collection
|
|
33
|
+
self.page_size = page_size
|
|
34
|
+
self.offset = offset
|
|
35
|
+
self.server_filter = server_filter
|
|
36
|
+
|
|
37
|
+
def run(self):
|
|
38
|
+
"""Load data from database."""
|
|
39
|
+
try:
|
|
40
|
+
data = self.connection.get_all_items(
|
|
41
|
+
self.collection,
|
|
42
|
+
limit=self.page_size,
|
|
43
|
+
offset=self.offset,
|
|
44
|
+
where=self.server_filter
|
|
45
|
+
)
|
|
46
|
+
if data:
|
|
47
|
+
self.finished.emit(data)
|
|
48
|
+
else:
|
|
49
|
+
self.error.emit("Failed to load data")
|
|
50
|
+
except Exception as e:
|
|
51
|
+
self.error.emit(str(e))
|
|
52
|
+
|
|
53
|
+
|
|
22
54
|
class MetadataView(QWidget):
|
|
23
55
|
"""View for browsing collection data and metadata."""
|
|
24
56
|
|
|
@@ -26,11 +58,14 @@ class MetadataView(QWidget):
|
|
|
26
58
|
super().__init__(parent)
|
|
27
59
|
self.connection = connection
|
|
28
60
|
self.current_collection: str = ""
|
|
61
|
+
self.current_database: str = ""
|
|
29
62
|
self.current_data: Optional[Dict[str, Any]] = None
|
|
30
63
|
self.page_size = 50
|
|
31
64
|
self.current_page = 0
|
|
32
65
|
self.loading_dialog = LoadingDialog("Loading data...", self)
|
|
33
66
|
self.settings_service = SettingsService()
|
|
67
|
+
self.load_thread: Optional[DataLoadThread] = None
|
|
68
|
+
self.cache_manager = get_cache_manager()
|
|
34
69
|
|
|
35
70
|
# Debounce timer for filter changes
|
|
36
71
|
self.filter_reload_timer = QTimer()
|
|
@@ -75,8 +110,9 @@ class MetadataView(QWidget):
|
|
|
75
110
|
controls_layout.addStretch()
|
|
76
111
|
|
|
77
112
|
# Refresh button
|
|
78
|
-
self.refresh_button = QPushButton("Refresh")
|
|
79
|
-
self.refresh_button.clicked.connect(self.
|
|
113
|
+
self.refresh_button = QPushButton("🔄 Refresh")
|
|
114
|
+
self.refresh_button.clicked.connect(self._refresh_data)
|
|
115
|
+
self.refresh_button.setToolTip("Refresh data and clear cache")
|
|
80
116
|
controls_layout.addWidget(self.refresh_button)
|
|
81
117
|
|
|
82
118
|
# Add/Delete buttons
|
|
@@ -140,26 +176,47 @@ class MetadataView(QWidget):
|
|
|
140
176
|
self.status_label.setStyleSheet("color: gray;")
|
|
141
177
|
layout.addWidget(self.status_label)
|
|
142
178
|
|
|
143
|
-
def set_collection(self, collection_name: str):
|
|
179
|
+
def set_collection(self, collection_name: str, database_name: str = ""):
|
|
144
180
|
"""Set the current collection to display."""
|
|
145
181
|
self.current_collection = collection_name
|
|
182
|
+
# Always update database_name if provided (even if empty string on first call)
|
|
183
|
+
if database_name: # Only update if non-empty
|
|
184
|
+
self.current_database = database_name
|
|
185
|
+
|
|
186
|
+
# Debug: Check cache status
|
|
187
|
+
print(f"[MetadataView] Setting collection: db='{self.current_database}', coll='{collection_name}'")
|
|
188
|
+
print(f"[MetadataView] Cache enabled: {self.cache_manager.is_enabled()}")
|
|
189
|
+
|
|
190
|
+
# Check cache first
|
|
191
|
+
cached = self.cache_manager.get(self.current_database, self.current_collection)
|
|
192
|
+
if cached and cached.data:
|
|
193
|
+
print(f"[MetadataView] ✓ Cache HIT! Loading from cache.")
|
|
194
|
+
# Restore from cache
|
|
195
|
+
self.current_page = 0
|
|
196
|
+
self.current_data = cached.data
|
|
197
|
+
self._populate_table(cached.data)
|
|
198
|
+
self._update_pagination_controls()
|
|
199
|
+
self._update_filter_fields(cached.data)
|
|
200
|
+
|
|
201
|
+
# Restore UI state
|
|
202
|
+
if cached.scroll_position:
|
|
203
|
+
self.table.verticalScrollBar().setValue(cached.scroll_position)
|
|
204
|
+
if cached.search_query:
|
|
205
|
+
# Restore filter state if applicable
|
|
206
|
+
pass
|
|
207
|
+
|
|
208
|
+
self.status_label.setText(f"✓ Loaded from cache - {len(cached.data.get('ids', []))} items")
|
|
209
|
+
return
|
|
210
|
+
|
|
211
|
+
print(f"[MetadataView] ✗ Cache MISS. Loading from database...")
|
|
212
|
+
# Not in cache, load from database
|
|
146
213
|
self.current_page = 0
|
|
147
214
|
|
|
148
|
-
#
|
|
149
|
-
self.
|
|
150
|
-
|
|
215
|
+
# Update filter builder with supported operators
|
|
216
|
+
operators = self.connection.get_supported_filter_operators()
|
|
217
|
+
self.filter_builder.set_operators(operators)
|
|
151
218
|
|
|
152
|
-
|
|
153
|
-
# Update filter builder with supported operators
|
|
154
|
-
operators = self.connection.get_supported_filter_operators()
|
|
155
|
-
self.filter_builder.set_operators(operators)
|
|
156
|
-
|
|
157
|
-
self._load_data_internal()
|
|
158
|
-
|
|
159
|
-
# Ensure UI is fully updated before hiding loading dialog
|
|
160
|
-
QApplication.processEvents()
|
|
161
|
-
finally:
|
|
162
|
-
self.loading_dialog.hide_loading()
|
|
219
|
+
self._load_data_internal()
|
|
163
220
|
|
|
164
221
|
def _load_data(self):
|
|
165
222
|
"""Load data from current collection (with loading dialog)."""
|
|
@@ -182,29 +239,42 @@ class MetadataView(QWidget):
|
|
|
182
239
|
self.table.setRowCount(0)
|
|
183
240
|
return
|
|
184
241
|
|
|
242
|
+
# Cancel any existing load thread
|
|
243
|
+
if self.load_thread and self.load_thread.isRunning():
|
|
244
|
+
self.load_thread.quit()
|
|
245
|
+
self.load_thread.wait()
|
|
246
|
+
|
|
185
247
|
offset = self.current_page * self.page_size
|
|
186
248
|
|
|
187
249
|
# Get filters split into server-side and client-side
|
|
188
250
|
server_filter = None
|
|
189
|
-
client_filters = []
|
|
251
|
+
self.client_filters = []
|
|
190
252
|
if self.filter_group.isChecked() and self.filter_builder.has_filters():
|
|
191
|
-
server_filter, client_filters = self.filter_builder.get_filters_split()
|
|
253
|
+
server_filter, self.client_filters = self.filter_builder.get_filters_split()
|
|
192
254
|
|
|
193
|
-
|
|
255
|
+
# Start background thread to load data
|
|
256
|
+
self.load_thread = DataLoadThread(
|
|
257
|
+
self.connection,
|
|
194
258
|
self.current_collection,
|
|
195
|
-
|
|
196
|
-
offset
|
|
197
|
-
|
|
259
|
+
self.page_size,
|
|
260
|
+
offset,
|
|
261
|
+
server_filter
|
|
198
262
|
)
|
|
199
|
-
|
|
263
|
+
self.load_thread.finished.connect(self._on_data_loaded)
|
|
264
|
+
self.load_thread.error.connect(self._on_load_error)
|
|
265
|
+
self.load_thread.start()
|
|
266
|
+
|
|
267
|
+
def _on_data_loaded(self, data: Dict[str, Any]):
|
|
268
|
+
"""Handle data loaded from background thread."""
|
|
200
269
|
# Apply client-side filters if any
|
|
201
|
-
if client_filters and data:
|
|
202
|
-
data = apply_client_side_filters(data, client_filters)
|
|
270
|
+
if self.client_filters and data:
|
|
271
|
+
data = apply_client_side_filters(data, self.client_filters)
|
|
203
272
|
|
|
204
273
|
if not data:
|
|
205
|
-
self.status_label.setText("
|
|
274
|
+
self.status_label.setText("No data after filtering")
|
|
206
275
|
self.table.setRowCount(0)
|
|
207
276
|
return
|
|
277
|
+
|
|
208
278
|
self.current_data = data
|
|
209
279
|
self._populate_table(data)
|
|
210
280
|
self._update_pagination_controls()
|
|
@@ -212,6 +282,24 @@ class MetadataView(QWidget):
|
|
|
212
282
|
# Update filter builder with available metadata fields
|
|
213
283
|
self._update_filter_fields(data)
|
|
214
284
|
|
|
285
|
+
# Save to cache
|
|
286
|
+
if self.current_database and self.current_collection:
|
|
287
|
+
print(f"[MetadataView] Saving to cache: db='{self.current_database}', coll='{self.current_collection}'")
|
|
288
|
+
cache_entry = CacheEntry(
|
|
289
|
+
data=data,
|
|
290
|
+
scroll_position=self.table.verticalScrollBar().value(),
|
|
291
|
+
search_query=self.filter_builder.to_dict() if hasattr(self.filter_builder, 'to_dict') else ""
|
|
292
|
+
)
|
|
293
|
+
self.cache_manager.set(self.current_database, self.current_collection, cache_entry)
|
|
294
|
+
print(f"[MetadataView] ✓ Saved to cache. Total entries: {len(self.cache_manager._cache)}")
|
|
295
|
+
else:
|
|
296
|
+
print(f"[MetadataView] ✗ NOT saving to cache - db='{self.current_database}', coll='{self.current_collection}'")
|
|
297
|
+
|
|
298
|
+
def _on_load_error(self, error_msg: str):
|
|
299
|
+
"""Handle error from background thread."""
|
|
300
|
+
self.status_label.setText(f"Failed to load data: {error_msg}")
|
|
301
|
+
self.table.setRowCount(0)
|
|
302
|
+
|
|
215
303
|
def _update_filter_fields(self, data: Dict[str, Any]):
|
|
216
304
|
"""Update filter builder with available metadata field names."""
|
|
217
305
|
field_names = []
|
|
@@ -325,6 +413,9 @@ class MetadataView(QWidget):
|
|
|
325
413
|
)
|
|
326
414
|
|
|
327
415
|
if success:
|
|
416
|
+
# Invalidate cache after adding item
|
|
417
|
+
if self.current_database and self.current_collection:
|
|
418
|
+
self.cache_manager.invalidate(self.current_database, self.current_collection)
|
|
328
419
|
QMessageBox.information(self, "Success", "Item added successfully.")
|
|
329
420
|
self._load_data()
|
|
330
421
|
else:
|
|
@@ -359,6 +450,9 @@ class MetadataView(QWidget):
|
|
|
359
450
|
if reply == QMessageBox.Yes:
|
|
360
451
|
success = self.connection.delete_items(self.current_collection, ids=ids_to_delete)
|
|
361
452
|
if success:
|
|
453
|
+
# Invalidate cache after deletion
|
|
454
|
+
if self.current_database and self.current_collection:
|
|
455
|
+
self.cache_manager.invalidate(self.current_database, self.current_collection)
|
|
362
456
|
QMessageBox.information(self, "Success", "Items deleted successfully.")
|
|
363
457
|
self._load_data()
|
|
364
458
|
else:
|
|
@@ -382,6 +476,13 @@ class MetadataView(QWidget):
|
|
|
382
476
|
self.current_page = 0
|
|
383
477
|
self._load_data()
|
|
384
478
|
|
|
479
|
+
def _refresh_data(self):
|
|
480
|
+
"""Refresh data and invalidate cache."""
|
|
481
|
+
if self.current_database and self.current_collection:
|
|
482
|
+
self.cache_manager.invalidate(self.current_database, self.current_collection)
|
|
483
|
+
self.current_page = 0
|
|
484
|
+
self._load_data()
|
|
485
|
+
|
|
385
486
|
def _on_row_double_clicked(self, index):
|
|
386
487
|
"""Handle double-click on a row to edit item."""
|
|
387
488
|
if not self.current_collection or not self.current_data:
|
|
@@ -422,6 +523,9 @@ class MetadataView(QWidget):
|
|
|
422
523
|
)
|
|
423
524
|
|
|
424
525
|
if success:
|
|
526
|
+
# Invalidate cache after updating item
|
|
527
|
+
if self.current_database and self.current_collection:
|
|
528
|
+
self.cache_manager.invalidate(self.current_database, self.current_collection)
|
|
425
529
|
QMessageBox.information(self, "Success", "Item updated successfully.")
|
|
426
530
|
self._load_data()
|
|
427
531
|
else:
|
|
@@ -613,6 +717,10 @@ class MetadataView(QWidget):
|
|
|
613
717
|
self.loading_dialog.hide_loading()
|
|
614
718
|
|
|
615
719
|
if success:
|
|
720
|
+
# Invalidate cache after import
|
|
721
|
+
if self.current_database and self.current_collection:
|
|
722
|
+
self.cache_manager.invalidate(self.current_database, self.current_collection)
|
|
723
|
+
|
|
616
724
|
# Save the directory for next time
|
|
617
725
|
from pathlib import Path
|
|
618
726
|
self.settings_service.set("last_import_export_dir", str(Path(file_path).parent))
|
|
@@ -12,6 +12,7 @@ from vector_inspector.core.connections.base_connection import VectorDBConnection
|
|
|
12
12
|
from vector_inspector.ui.components.filter_builder import FilterBuilder
|
|
13
13
|
from vector_inspector.ui.components.loading_dialog import LoadingDialog
|
|
14
14
|
from vector_inspector.services.filter_service import apply_client_side_filters
|
|
15
|
+
from vector_inspector.core.cache_manager import get_cache_manager, CacheEntry
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
class SearchView(QWidget):
|
|
@@ -21,8 +22,10 @@ class SearchView(QWidget):
|
|
|
21
22
|
super().__init__(parent)
|
|
22
23
|
self.connection = connection
|
|
23
24
|
self.current_collection: str = ""
|
|
25
|
+
self.current_database: str = ""
|
|
24
26
|
self.search_results: Optional[Dict[str, Any]] = None
|
|
25
27
|
self.loading_dialog = LoadingDialog("Searching...", self)
|
|
28
|
+
self.cache_manager = get_cache_manager()
|
|
26
29
|
|
|
27
30
|
self._setup_ui()
|
|
28
31
|
|
|
@@ -112,12 +115,30 @@ class SearchView(QWidget):
|
|
|
112
115
|
|
|
113
116
|
layout.addWidget(splitter)
|
|
114
117
|
|
|
115
|
-
def set_collection(self, collection_name: str):
|
|
118
|
+
def set_collection(self, collection_name: str, database_name: str = ""):
|
|
116
119
|
"""Set the current collection to search."""
|
|
117
120
|
self.current_collection = collection_name
|
|
121
|
+
# Always update database_name if provided (even if empty string on first call)
|
|
122
|
+
if database_name: # Only update if non-empty
|
|
123
|
+
self.current_database = database_name
|
|
124
|
+
|
|
125
|
+
print(f"[SearchView] Setting collection: db='{self.current_database}', coll='{collection_name}'")
|
|
126
|
+
|
|
127
|
+
# Check cache first
|
|
128
|
+
cached = self.cache_manager.get(self.current_database, self.current_collection)
|
|
129
|
+
if cached:
|
|
130
|
+
print(f"[SearchView] ✓ Cache HIT! Restoring search state.")
|
|
131
|
+
# Restore search query and results from cache
|
|
132
|
+
if cached.search_query:
|
|
133
|
+
self.query_input.setPlainText(cached.search_query)
|
|
134
|
+
if cached.search_results:
|
|
135
|
+
self.search_results = cached.search_results
|
|
136
|
+
self._display_results(cached.search_results)
|
|
137
|
+
return
|
|
138
|
+
|
|
139
|
+
print(f"[SearchView] ✗ Cache MISS or no cached search.")
|
|
140
|
+
# Not in cache, clear form
|
|
118
141
|
self.search_results = None
|
|
119
|
-
|
|
120
|
-
# Clear search form inputs
|
|
121
142
|
self.query_input.clear()
|
|
122
143
|
self.results_table.setRowCount(0)
|
|
123
144
|
self.results_status.setText(f"Collection: {collection_name}")
|
|
@@ -196,6 +217,12 @@ class SearchView(QWidget):
|
|
|
196
217
|
self.results_table.setRowCount(0)
|
|
197
218
|
return
|
|
198
219
|
|
|
220
|
+
# Check if results have the expected structure
|
|
221
|
+
if not results.get("ids") or not isinstance(results["ids"], list) or len(results["ids"]) == 0:
|
|
222
|
+
self.results_status.setText("No results found or query failed")
|
|
223
|
+
self.results_table.setRowCount(0)
|
|
224
|
+
return
|
|
225
|
+
|
|
199
226
|
# Apply client-side filters if any
|
|
200
227
|
if client_filters and results:
|
|
201
228
|
# Restructure results for filtering
|
|
@@ -219,6 +246,19 @@ class SearchView(QWidget):
|
|
|
219
246
|
self.search_results = results
|
|
220
247
|
self._display_results(results)
|
|
221
248
|
|
|
249
|
+
# Save to cache
|
|
250
|
+
if self.current_database and self.current_collection:
|
|
251
|
+
self.cache_manager.update(
|
|
252
|
+
self.current_database,
|
|
253
|
+
self.current_collection,
|
|
254
|
+
search_query=query_text,
|
|
255
|
+
search_results=results,
|
|
256
|
+
user_inputs={
|
|
257
|
+
'n_results': n_results,
|
|
258
|
+
'filters': self.filter_builder.to_dict() if hasattr(self.filter_builder, 'to_dict') else {}
|
|
259
|
+
}
|
|
260
|
+
)
|
|
261
|
+
|
|
222
262
|
def _display_results(self, results: Dict[str, Any]):
|
|
223
263
|
"""Display search results in table."""
|
|
224
264
|
ids = results.get("ids", [[]])[0]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vector-inspector
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
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
|
|
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://vector-inspector.divinedevops.com
|
|
|
8
8
|
Project-URL: Source, https://github.com/anthonypdawson/vector-inspector
|
|
9
9
|
Project-URL: Issues, https://github.com/anthonypdawson/vector-inspector/issues
|
|
10
10
|
Project-URL: Documentation, https://github.com/anthonypdawson/vector-inspector#readme
|
|
11
|
-
Requires-Python:
|
|
11
|
+
Requires-Python: <3.13,>=3.10
|
|
12
12
|
Requires-Dist: chromadb>=0.4.22
|
|
13
13
|
Requires-Dist: qdrant-client>=1.7.0
|
|
14
14
|
Requires-Dist: pyside6>=6.6.0
|
|
@@ -22,12 +22,14 @@ Requires-Dist: sentence-transformers>=2.2.0
|
|
|
22
22
|
Requires-Dist: fastembed>=0.7.4
|
|
23
23
|
Requires-Dist: pyarrow>=14.0.0
|
|
24
24
|
Requires-Dist: pinecone>=8.0.0
|
|
25
|
+
Requires-Dist: keyring>=25.7.0
|
|
26
|
+
Requires-Dist: hf-xet>=1.2.0
|
|
25
27
|
Description-Content-Type: text/markdown
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
# Vector Inspector
|
|
29
31
|
|
|
30
|
-
> **Disclaimer:** This tool is currently under active development and is **not production ready**. Not all features have been thoroughly tested. Use with caution in critical or production environments.
|
|
32
|
+
> **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.
|
|
31
33
|
|
|
32
34
|

|
|
33
35
|
[](https://pepy.tech/projects/vector-inspector)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
vector_inspector-0.2.7.dist-info/METADATA,sha256=mahmP5eIlgej1osckY_twV3dQhSnX7BT20B1ivrsiu4,9684
|
|
2
|
+
vector_inspector-0.2.7.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
|
|
3
|
+
vector_inspector-0.2.7.dist-info/entry_points.txt,sha256=u96envMI2NFImZUJDFutiiWl7ZoHrrev9joAgtyvTxo,80
|
|
4
|
+
vector_inspector/__init__.py,sha256=Q8XbXn98o0eliQWPePhy-aGUz2KNnVg7bQq-sBPl7zQ,119
|
|
5
|
+
vector_inspector/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
|
|
6
|
+
vector_inspector/core/__init__.py,sha256=hjOqiJwF1P0rXjiOKhK4qDTvBY7G3m4kq8taH-gKrFM,57
|
|
7
|
+
vector_inspector/core/cache_manager.py,sha256=cHdbIYR-eS9vLLTqvq4Xejyi5Z7Fm9DqMhb_PMZjnjY,5695
|
|
8
|
+
vector_inspector/core/connection_manager.py,sha256=WwiVedHWTfqIuJKV7D52bYEupmpnnSPKcgG1odJCJjs,10003
|
|
9
|
+
vector_inspector/core/connections/__init__.py,sha256=cCwDy69Jy8ajiFQICcWfPnGoMtfrq69brzXJ4sVYCQ0,271
|
|
10
|
+
vector_inspector/core/connections/base_connection.py,sha256=PiwVlrk-eUKSka6gmE2GSyml0xe48PrIWAcKhBJMBv8,7131
|
|
11
|
+
vector_inspector/core/connections/chroma_connection.py,sha256=eBMrJQg_J01mWrEmKdK_p3-zJRNA7sOuFWd_bYit3y8,18298
|
|
12
|
+
vector_inspector/core/connections/qdrant_connection.py,sha256=m0EFgSbWRVh3uv_JkbB0WEotu20G967TrHvwJrtedO4,31861
|
|
13
|
+
vector_inspector/core/connections/template_connection.py,sha256=wsJiE4ma3cLUXk2eW5rnLMS5wG8JTekgEn46lHHQNoc,10642
|
|
14
|
+
vector_inspector/core/embedding_utils.py,sha256=LJK3YXwng7nO3csSkPHrixXIXBFf06tspq1ZSxSGgsM,4933
|
|
15
|
+
vector_inspector/main.py,sha256=puu1Fur298j6H8fG3_wF85RMhi4tjLZ0Are16kloMqM,479
|
|
16
|
+
vector_inspector/services/__init__.py,sha256=QLgH7oybjHuEYDFNiBgmJxvSpgAzHEuBEPXa3SKJb_I,67
|
|
17
|
+
vector_inspector/services/backup_restore_service.py,sha256=3lZ25FXG6DHQtJNiaIe8ZJgvxMRWuPrIJIBKPGWe7gA,10618
|
|
18
|
+
vector_inspector/services/credential_service.py,sha256=pdpglvLABnYQRvklgK38iPyG91IZ9Nm8WQFT9V0LofM,4354
|
|
19
|
+
vector_inspector/services/filter_service.py,sha256=xDrMxNWsYzRcR1n0Fd-yp6Fo-4aLbVIDkhj2GKmrw5o,2370
|
|
20
|
+
vector_inspector/services/import_export_service.py,sha256=OPCrBXBewCznu5o8wFGvduU0jGZAcBvp_Fpv15kdoJ4,10712
|
|
21
|
+
vector_inspector/services/profile_service.py,sha256=Uhl9urxeSRI0p-mfaYgBrMI99byNIxJSodcXOgD_ybw,13408
|
|
22
|
+
vector_inspector/services/settings_service.py,sha256=g07fyPPgI4VvidJ_xgpuj5id-M1pDXvIh6_ZXnkUqAI,2914
|
|
23
|
+
vector_inspector/services/visualization_service.py,sha256=mHI4qxT-V4R1kcOhE508vFTZ0HcmQICHvJ7dIoRracQ,4373
|
|
24
|
+
vector_inspector/ui/__init__.py,sha256=262ZiXO6Luk8vZnhCIoYxOtGiny0bXK-BTKjxUNBx-w,43
|
|
25
|
+
vector_inspector/ui/components/__init__.py,sha256=S-GWU1P820dJ6mHmeeBEy-CGF9fjpBeNf8vrbhRlFMk,30
|
|
26
|
+
vector_inspector/ui/components/backup_restore_dialog.py,sha256=CrZ2u8vXzggv3aBkYR4FulpY74oZWMLW5BHU4dMiWug,13073
|
|
27
|
+
vector_inspector/ui/components/connection_manager_panel.py,sha256=6d_uNaaNaayYz4HV3LndiQsYFISpsSCwj4-sN-Qt8uc,12963
|
|
28
|
+
vector_inspector/ui/components/filter_builder.py,sha256=NSR_hp-rzUZVAca6dIJhTxZA3igOKFM1g-YXiYPhFos,13360
|
|
29
|
+
vector_inspector/ui/components/item_dialog.py,sha256=VMwehEjQ6xrdxWygR9J-hHsLfzOVb_E3ePUGYO_c7XA,3951
|
|
30
|
+
vector_inspector/ui/components/loading_dialog.py,sha256=YEKYGU-R-Zz4CjXSArJtkNxgTy4O9hI5Bbt6qlIzD8U,1018
|
|
31
|
+
vector_inspector/ui/components/profile_manager_panel.py,sha256=mXs2vOazUbmqzF7SNABtdKmeys6RjwtcgKaEKYK5MuI,18702
|
|
32
|
+
vector_inspector/ui/dialogs/__init__.py,sha256=U49PF3Jn57qkdjJ0hjMnhvQKv2xeB5e2SretF_24T_U,136
|
|
33
|
+
vector_inspector/ui/dialogs/cross_db_migration.py,sha256=fIhnD5kJeqSPe5bwf2KFkjk3dQY_kda0zZVsPHtB1w8,14500
|
|
34
|
+
vector_inspector/ui/dialogs/embedding_config_dialog.py,sha256=g-MVuVE4_ZAZjA-yVa6ZaFU2-vrEQnVYiHqEmjoBqmM,7358
|
|
35
|
+
vector_inspector/ui/main_window.py,sha256=OPuAODir7LPUenNetNYwhwQ49p_zFA3axx014yQhJSg,24554
|
|
36
|
+
vector_inspector/ui/views/__init__.py,sha256=FeMtVzSbVFBMjdwLQSQqD0FRW4ieJ4ZKXtTBci2e_bw,30
|
|
37
|
+
vector_inspector/ui/views/collection_browser.py,sha256=oG9_YGPoVuMs-f_zSd4EcITmEU9caxvwuubsFUrNf-c,3991
|
|
38
|
+
vector_inspector/ui/views/connection_view.py,sha256=CpHPSDee3RhH3_wNu62RI3Fn5ffBIGt_Va5iC0p1IoY,18116
|
|
39
|
+
vector_inspector/ui/views/info_panel.py,sha256=tNKlWsb5KalxstOmC0xYY5UH4pW4qY_ysJcRrPQMcWk,21624
|
|
40
|
+
vector_inspector/ui/views/metadata_view.py,sha256=dIe7aH47xd6TBK2g-WogR2Ts0enHGeSAEUlu48sdTF8,30535
|
|
41
|
+
vector_inspector/ui/views/search_view.py,sha256=IMPZE7SPGoNuVbbffIjv1HxM-qZpmx0L1qtB9EYizjI,12474
|
|
42
|
+
vector_inspector/ui/views/visualization_view.py,sha256=uPOUpKJ00eFqCCohYEfMD8D9lNv2cy2FymPHouXK0Go,9163
|
|
43
|
+
vector_inspector/utils/__init__.py,sha256=jhHBQC8C8bfhNlf6CAt07ejjStp_YAyleaYr2dm0Dk0,38
|
|
44
|
+
vector_inspector/utils/lazy_imports.py,sha256=2XZ3ZnwTvZ5vvrh36nJ_TUjwwkgjoAED6i6P9yctvt0,1211
|
|
45
|
+
vector_inspector-0.2.7.dist-info/RECORD,,
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
vector_inspector-0.2.5.dist-info/METADATA,sha256=-rLViXjk2x6cSGhrP3VTkEyjsUWJxqz7cOGB1IjeNJI,9588
|
|
2
|
-
vector_inspector-0.2.5.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
|
|
3
|
-
vector_inspector-0.2.5.dist-info/entry_points.txt,sha256=u96envMI2NFImZUJDFutiiWl7ZoHrrev9joAgtyvTxo,80
|
|
4
|
-
vector_inspector/__init__.py,sha256=Q8XbXn98o0eliQWPePhy-aGUz2KNnVg7bQq-sBPl7zQ,119
|
|
5
|
-
vector_inspector/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
|
|
6
|
-
vector_inspector/core/__init__.py,sha256=hjOqiJwF1P0rXjiOKhK4qDTvBY7G3m4kq8taH-gKrFM,57
|
|
7
|
-
vector_inspector/core/connections/__init__.py,sha256=cCwDy69Jy8ajiFQICcWfPnGoMtfrq69brzXJ4sVYCQ0,271
|
|
8
|
-
vector_inspector/core/connections/base_connection.py,sha256=PiwVlrk-eUKSka6gmE2GSyml0xe48PrIWAcKhBJMBv8,7131
|
|
9
|
-
vector_inspector/core/connections/chroma_connection.py,sha256=8dmMtTeMylZRqIvjbBgH6BWqbdd4vv9bJ9uf-C7fLHw,13943
|
|
10
|
-
vector_inspector/core/connections/qdrant_connection.py,sha256=jjqRR_zJ-d2Kq9jS2_v6zTE_PY3HI_oss8mJi6gDZvo,28634
|
|
11
|
-
vector_inspector/core/connections/template_connection.py,sha256=wsJiE4ma3cLUXk2eW5rnLMS5wG8JTekgEn46lHHQNoc,10642
|
|
12
|
-
vector_inspector/main.py,sha256=puu1Fur298j6H8fG3_wF85RMhi4tjLZ0Are16kloMqM,479
|
|
13
|
-
vector_inspector/services/__init__.py,sha256=QLgH7oybjHuEYDFNiBgmJxvSpgAzHEuBEPXa3SKJb_I,67
|
|
14
|
-
vector_inspector/services/backup_restore_service.py,sha256=2bbmLamGg7gaYUl3zy_-8wL8xbYvO00kZ2tbImZkzi0,11782
|
|
15
|
-
vector_inspector/services/filter_service.py,sha256=r1y_lPi4Mo4ZqVq_hfbTzRxcCbdH7RlsXg7ytkBTKi8,2334
|
|
16
|
-
vector_inspector/services/import_export_service.py,sha256=OPCrBXBewCznu5o8wFGvduU0jGZAcBvp_Fpv15kdoJ4,10712
|
|
17
|
-
vector_inspector/services/settings_service.py,sha256=Y-2eJGyxUPPZid-3S0rCZ13xTRSLWYIOQ3ckSGX7gvE,2078
|
|
18
|
-
vector_inspector/services/visualization_service.py,sha256=LO7VxFEni98Yah4MykQzNnuDxQPU3WTdYhkLnEC5buc,4121
|
|
19
|
-
vector_inspector/ui/__init__.py,sha256=262ZiXO6Luk8vZnhCIoYxOtGiny0bXK-BTKjxUNBx-w,43
|
|
20
|
-
vector_inspector/ui/components/__init__.py,sha256=S-GWU1P820dJ6mHmeeBEy-CGF9fjpBeNf8vrbhRlFMk,30
|
|
21
|
-
vector_inspector/ui/components/backup_restore_dialog.py,sha256=CrZ2u8vXzggv3aBkYR4FulpY74oZWMLW5BHU4dMiWug,13073
|
|
22
|
-
vector_inspector/ui/components/filter_builder.py,sha256=NSR_hp-rzUZVAca6dIJhTxZA3igOKFM1g-YXiYPhFos,13360
|
|
23
|
-
vector_inspector/ui/components/item_dialog.py,sha256=VMwehEjQ6xrdxWygR9J-hHsLfzOVb_E3ePUGYO_c7XA,3951
|
|
24
|
-
vector_inspector/ui/components/loading_dialog.py,sha256=YEKYGU-R-Zz4CjXSArJtkNxgTy4O9hI5Bbt6qlIzD8U,1018
|
|
25
|
-
vector_inspector/ui/main_window.py,sha256=gAR_2J0k1lmfhSPhL3wv1B_jjm0k6V_5NF_nZ2i3-4c,13500
|
|
26
|
-
vector_inspector/ui/views/__init__.py,sha256=FeMtVzSbVFBMjdwLQSQqD0FRW4ieJ4ZKXtTBci2e_bw,30
|
|
27
|
-
vector_inspector/ui/views/collection_browser.py,sha256=oG9_YGPoVuMs-f_zSd4EcITmEU9caxvwuubsFUrNf-c,3991
|
|
28
|
-
vector_inspector/ui/views/connection_view.py,sha256=5TL28JMfb0W42eUDDNbj6bIaj6m7WpalpdUEcd37qmM,16903
|
|
29
|
-
vector_inspector/ui/views/info_panel.py,sha256=Y3ad6tF1vBQN3WrM6blc30ETQqJb9a_lMvIl97kWlU8,15356
|
|
30
|
-
vector_inspector/ui/views/metadata_view.py,sha256=aBMHJU61ljttRljOuAkemZkLEowjSaTnMl-lSCZRb88,25453
|
|
31
|
-
vector_inspector/ui/views/search_view.py,sha256=p6vt2heSpEbiRge46VSedTZjg7i3-AWdS0f96JXzlEU,10527
|
|
32
|
-
vector_inspector/ui/views/visualization_view.py,sha256=uPOUpKJ00eFqCCohYEfMD8D9lNv2cy2FymPHouXK0Go,9163
|
|
33
|
-
vector_inspector/utils/__init__.py,sha256=jhHBQC8C8bfhNlf6CAt07ejjStp_YAyleaYr2dm0Dk0,38
|
|
34
|
-
vector_inspector/utils/lazy_imports.py,sha256=2XZ3ZnwTvZ5vvrh36nJ_TUjwwkgjoAED6i6P9yctvt0,1211
|
|
35
|
-
vector_inspector-0.2.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|