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.
Files changed (26) hide show
  1. vector_inspector/core/cache_manager.py +159 -0
  2. vector_inspector/core/connection_manager.py +277 -0
  3. vector_inspector/core/connections/chroma_connection.py +90 -5
  4. vector_inspector/core/connections/qdrant_connection.py +62 -8
  5. vector_inspector/core/embedding_utils.py +140 -0
  6. vector_inspector/services/backup_restore_service.py +3 -29
  7. vector_inspector/services/credential_service.py +130 -0
  8. vector_inspector/services/filter_service.py +1 -1
  9. vector_inspector/services/profile_service.py +409 -0
  10. vector_inspector/services/settings_service.py +20 -1
  11. vector_inspector/services/visualization_service.py +11 -7
  12. vector_inspector/ui/components/connection_manager_panel.py +320 -0
  13. vector_inspector/ui/components/profile_manager_panel.py +518 -0
  14. vector_inspector/ui/dialogs/__init__.py +5 -0
  15. vector_inspector/ui/dialogs/cross_db_migration.py +364 -0
  16. vector_inspector/ui/dialogs/embedding_config_dialog.py +176 -0
  17. vector_inspector/ui/main_window.py +429 -181
  18. vector_inspector/ui/views/connection_view.py +43 -8
  19. vector_inspector/ui/views/info_panel.py +226 -80
  20. vector_inspector/ui/views/metadata_view.py +136 -28
  21. vector_inspector/ui/views/search_view.py +43 -3
  22. {vector_inspector-0.2.5.dist-info → vector_inspector-0.2.7.dist-info}/METADATA +5 -3
  23. vector_inspector-0.2.7.dist-info/RECORD +45 -0
  24. vector_inspector-0.2.5.dist-info/RECORD +0 -35
  25. {vector_inspector-0.2.5.dist-info → vector_inspector-0.2.7.dist-info}/WHEEL +0 -0
  26. {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._load_data)
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
- # Show loading dialog at the start
149
- self.loading_dialog.show_loading("Loading collection data...")
150
- QApplication.processEvents()
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
- try:
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
- data = self.connection.get_all_items(
255
+ # Start background thread to load data
256
+ self.load_thread = DataLoadThread(
257
+ self.connection,
194
258
  self.current_collection,
195
- limit=self.page_size,
196
- offset=offset,
197
- where=server_filter
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("Failed to load data")
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.5
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: ==3.12.*
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
  ![PyPI](https://img.shields.io/pypi/v/vector-inspector)
33
35
  [![PyPI Downloads](https://static.pepy.tech/personalized-badge/vector-inspector?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](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,,