vector-inspector 0.3.6__py3-none-any.whl → 0.3.8__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/connections/chroma_connection.py +4 -1
- vector_inspector/core/connections/pgvector_connection.py +108 -93
- vector_inspector/core/connections/pinecone_connection.py +4 -0
- vector_inspector/core/connections/qdrant_connection.py +13 -0
- vector_inspector/core/provider_factory.py +97 -0
- vector_inspector/services/update_service.py +73 -0
- vector_inspector/ui/components/splash_window.py +14 -2
- vector_inspector/ui/components/update_details_dialog.py +47 -0
- vector_inspector/ui/controllers/__init__.py +1 -0
- vector_inspector/ui/controllers/connection_controller.py +177 -0
- vector_inspector/ui/main_window.py +148 -323
- vector_inspector/ui/main_window_shell.py +106 -0
- vector_inspector/ui/services/__init__.py +1 -0
- vector_inspector/ui/services/dialog_service.py +113 -0
- vector_inspector/ui/tabs.py +64 -0
- vector_inspector/ui/views/metadata_view.py +72 -0
- vector_inspector/utils/version.py +11 -4
- {vector_inspector-0.3.6.dist-info → vector_inspector-0.3.8.dist-info}/METADATA +27 -5
- {vector_inspector-0.3.6.dist-info → vector_inspector-0.3.8.dist-info}/RECORD +21 -12
- {vector_inspector-0.3.6.dist-info → vector_inspector-0.3.8.dist-info}/WHEEL +0 -0
- {vector_inspector-0.3.6.dist-info → vector_inspector-0.3.8.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Reusable UI shell for Vector Inspector applications."""
|
|
2
|
+
|
|
3
|
+
from PySide6.QtWidgets import (
|
|
4
|
+
QMainWindow,
|
|
5
|
+
QWidget,
|
|
6
|
+
QVBoxLayout,
|
|
7
|
+
QHBoxLayout,
|
|
8
|
+
QSplitter,
|
|
9
|
+
QTabWidget,
|
|
10
|
+
)
|
|
11
|
+
from PySide6.QtCore import Qt
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class InspectorShell(QMainWindow):
|
|
15
|
+
"""Base shell for Inspector applications with splitter, tab widget, and left panel.
|
|
16
|
+
|
|
17
|
+
This provides the basic UI structure that can be reused by Vector Inspector
|
|
18
|
+
and Vector Fusion Studio. Subclasses customize behavior and add domain logic.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self):
|
|
22
|
+
super().__init__()
|
|
23
|
+
|
|
24
|
+
# Main UI components that subclasses will interact with
|
|
25
|
+
self.left_tabs = None
|
|
26
|
+
self.tab_widget = None
|
|
27
|
+
self.main_splitter = None
|
|
28
|
+
|
|
29
|
+
self._setup_shell_ui()
|
|
30
|
+
|
|
31
|
+
def _setup_shell_ui(self):
|
|
32
|
+
"""Setup the main UI shell layout."""
|
|
33
|
+
# Central widget with splitter
|
|
34
|
+
central_widget = QWidget()
|
|
35
|
+
self.setCentralWidget(central_widget)
|
|
36
|
+
|
|
37
|
+
layout = QHBoxLayout(central_widget)
|
|
38
|
+
layout.setContentsMargins(5, 5, 5, 5)
|
|
39
|
+
|
|
40
|
+
# Main splitter (left panel | right tabs)
|
|
41
|
+
self.main_splitter = QSplitter(Qt.Horizontal)
|
|
42
|
+
|
|
43
|
+
# Left panel container (will hold tabs)
|
|
44
|
+
left_panel = QWidget()
|
|
45
|
+
left_layout = QVBoxLayout(left_panel)
|
|
46
|
+
left_layout.setContentsMargins(0, 0, 0, 0)
|
|
47
|
+
|
|
48
|
+
# Create tab widget for left panel
|
|
49
|
+
self.left_tabs = QTabWidget()
|
|
50
|
+
left_layout.addWidget(self.left_tabs)
|
|
51
|
+
|
|
52
|
+
# Right panel - main content tabs
|
|
53
|
+
self.tab_widget = QTabWidget()
|
|
54
|
+
|
|
55
|
+
# Add panels to splitter
|
|
56
|
+
self.main_splitter.addWidget(left_panel)
|
|
57
|
+
self.main_splitter.addWidget(self.tab_widget)
|
|
58
|
+
self.main_splitter.setStretchFactor(0, 1)
|
|
59
|
+
self.main_splitter.setStretchFactor(1, 4)
|
|
60
|
+
|
|
61
|
+
layout.addWidget(self.main_splitter)
|
|
62
|
+
|
|
63
|
+
def add_left_panel(self, widget: QWidget, title: str, index: int = -1):
|
|
64
|
+
"""Add a panel to the left tab widget.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
widget: The panel widget to add
|
|
68
|
+
title: Display title for the tab
|
|
69
|
+
index: Optional position (default appends to end)
|
|
70
|
+
"""
|
|
71
|
+
if index < 0:
|
|
72
|
+
self.left_tabs.addTab(widget, title)
|
|
73
|
+
else:
|
|
74
|
+
self.left_tabs.insertTab(index, widget, title)
|
|
75
|
+
|
|
76
|
+
def add_main_tab(self, widget: QWidget, title: str, index: int = -1):
|
|
77
|
+
"""Add a tab to the main content area.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
widget: The tab widget to add
|
|
81
|
+
title: Display title for the tab
|
|
82
|
+
index: Optional position (default appends to end)
|
|
83
|
+
"""
|
|
84
|
+
if index < 0:
|
|
85
|
+
self.tab_widget.addTab(widget, title)
|
|
86
|
+
else:
|
|
87
|
+
self.tab_widget.insertTab(index, widget, title)
|
|
88
|
+
|
|
89
|
+
def set_left_panel_active(self, index: int):
|
|
90
|
+
"""Switch to a specific left panel tab."""
|
|
91
|
+
if 0 <= index < self.left_tabs.count():
|
|
92
|
+
self.left_tabs.setCurrentIndex(index)
|
|
93
|
+
|
|
94
|
+
def set_main_tab_active(self, index: int):
|
|
95
|
+
"""Switch to a specific main content tab."""
|
|
96
|
+
if 0 <= index < self.tab_widget.count():
|
|
97
|
+
self.tab_widget.setCurrentIndex(index)
|
|
98
|
+
|
|
99
|
+
def get_main_tab_count(self) -> int:
|
|
100
|
+
"""Get the number of main content tabs."""
|
|
101
|
+
return self.tab_widget.count()
|
|
102
|
+
|
|
103
|
+
def remove_main_tab(self, index: int):
|
|
104
|
+
"""Remove a main content tab."""
|
|
105
|
+
if 0 <= index < self.tab_widget.count():
|
|
106
|
+
self.tab_widget.removeTab(index)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""UI services for dialog management and utilities."""
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Service for managing application dialogs."""
|
|
2
|
+
|
|
3
|
+
from PySide6.QtWidgets import QMessageBox, QDialog, QWidget
|
|
4
|
+
from vector_inspector.core.connection_manager import ConnectionManager
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DialogService:
|
|
8
|
+
"""Service for launching application dialogs."""
|
|
9
|
+
|
|
10
|
+
@staticmethod
|
|
11
|
+
def show_about(parent: QWidget = None):
|
|
12
|
+
"""Show about dialog."""
|
|
13
|
+
from vector_inspector.utils.version import get_app_version
|
|
14
|
+
|
|
15
|
+
version = get_app_version()
|
|
16
|
+
version_html = (
|
|
17
|
+
f"<h2>Vector Inspector {version}</h2>" if version else "<h2>Vector Inspector</h2>"
|
|
18
|
+
)
|
|
19
|
+
about_text = (
|
|
20
|
+
version_html + "<p>A comprehensive desktop application for visualizing, "
|
|
21
|
+
"querying, and managing multiple vector databases simultaneously.</p>"
|
|
22
|
+
'<p><a href="https://github.com/anthonypdawson/vector-inspector" style="color:#2980b9;">GitHub Project Page</a></p>'
|
|
23
|
+
"<hr />"
|
|
24
|
+
"<p>Built with PySide6</p>"
|
|
25
|
+
"<p><b>New:</b> Pinecone support!</p>"
|
|
26
|
+
)
|
|
27
|
+
QMessageBox.about(parent, "About Vector Inspector", about_text)
|
|
28
|
+
|
|
29
|
+
@staticmethod
|
|
30
|
+
def show_backup_restore_dialog(
|
|
31
|
+
connection, collection_name: str = "", parent: QWidget = None
|
|
32
|
+
) -> int:
|
|
33
|
+
"""Show backup/restore dialog.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
connection: Active connection instance
|
|
37
|
+
collection_name: Optional collection name
|
|
38
|
+
parent: Parent widget
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
QDialog.Accepted or QDialog.Rejected
|
|
42
|
+
"""
|
|
43
|
+
if not connection:
|
|
44
|
+
QMessageBox.information(parent, "No Connection", "Please connect to a database first.")
|
|
45
|
+
return QDialog.Rejected
|
|
46
|
+
|
|
47
|
+
# Show info if no collection selected
|
|
48
|
+
if not collection_name:
|
|
49
|
+
QMessageBox.information(
|
|
50
|
+
parent,
|
|
51
|
+
"No Collection Selected",
|
|
52
|
+
"You can restore backups without a collection selected.\n"
|
|
53
|
+
"To create a backup, please select a collection first.",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
from vector_inspector.ui.components.backup_restore_dialog import BackupRestoreDialog
|
|
57
|
+
|
|
58
|
+
dialog = BackupRestoreDialog(connection, collection_name or "", parent)
|
|
59
|
+
return dialog.exec()
|
|
60
|
+
|
|
61
|
+
@staticmethod
|
|
62
|
+
def show_migration_dialog(connection_manager: ConnectionManager, parent: QWidget = None) -> int:
|
|
63
|
+
"""Show cross-database migration dialog.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
connection_manager: Connection manager instance
|
|
67
|
+
parent: Parent widget
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
QDialog.Accepted or QDialog.Rejected
|
|
71
|
+
"""
|
|
72
|
+
if connection_manager.get_connection_count() < 2:
|
|
73
|
+
QMessageBox.information(
|
|
74
|
+
parent,
|
|
75
|
+
"Insufficient Connections",
|
|
76
|
+
"You need at least 2 active connections to migrate data.\n"
|
|
77
|
+
"Please connect to additional databases first.",
|
|
78
|
+
)
|
|
79
|
+
return QDialog.Rejected
|
|
80
|
+
|
|
81
|
+
from vector_inspector.ui.dialogs.cross_db_migration import CrossDatabaseMigrationDialog
|
|
82
|
+
|
|
83
|
+
dialog = CrossDatabaseMigrationDialog(connection_manager, parent)
|
|
84
|
+
return dialog.exec()
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def show_profile_editor_prompt(parent: QWidget = None):
|
|
88
|
+
"""Show message prompting user to create a new profile."""
|
|
89
|
+
QMessageBox.information(
|
|
90
|
+
parent,
|
|
91
|
+
"Connect to Profile",
|
|
92
|
+
"Select a profile from the list and click 'Connect', or click '+' to create a new profile.",
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
@staticmethod
|
|
96
|
+
def show_update_details(latest_release: dict, parent: QWidget = None):
|
|
97
|
+
"""Show update details dialog.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
latest_release: Latest release info from GitHub API
|
|
101
|
+
parent: Parent widget
|
|
102
|
+
"""
|
|
103
|
+
from vector_inspector.ui.components.update_details_dialog import UpdateDetailsDialog
|
|
104
|
+
from vector_inspector.services.update_service import UpdateService
|
|
105
|
+
|
|
106
|
+
version = latest_release.get("tag_name", "?")
|
|
107
|
+
notes = latest_release.get("body", "")
|
|
108
|
+
instructions = UpdateService.get_update_instructions()
|
|
109
|
+
pip_cmd = instructions["pip"]
|
|
110
|
+
github_url = instructions["github"]
|
|
111
|
+
|
|
112
|
+
dialog = UpdateDetailsDialog(version, notes, pip_cmd, github_url, parent)
|
|
113
|
+
dialog.exec()
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Tab registry for Inspector applications."""
|
|
2
|
+
|
|
3
|
+
from typing import List, Tuple, Type
|
|
4
|
+
from PySide6.QtWidgets import QWidget
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TabDefinition:
|
|
8
|
+
"""Definition for a tab in the main content area."""
|
|
9
|
+
|
|
10
|
+
def __init__(self, title: str, widget_class: Type[QWidget], lazy_load: bool = False):
|
|
11
|
+
self.title = title
|
|
12
|
+
self.widget_class = widget_class
|
|
13
|
+
self.lazy_load = lazy_load
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class InspectorTabs:
|
|
17
|
+
"""Registry of standard Inspector tabs.
|
|
18
|
+
|
|
19
|
+
This allows both Vector Inspector and Vector Fusion Studio to use
|
|
20
|
+
the same tab definitions and add their own custom tabs.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
# Tab indices (for programmatic access)
|
|
24
|
+
INFO_TAB = 0
|
|
25
|
+
DATA_TAB = 1
|
|
26
|
+
SEARCH_TAB = 2
|
|
27
|
+
VISUALIZATION_TAB = 3
|
|
28
|
+
|
|
29
|
+
@staticmethod
|
|
30
|
+
def get_standard_tabs() -> List[TabDefinition]:
|
|
31
|
+
"""Get list of standard Inspector tabs.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
List of TabDefinition objects
|
|
35
|
+
"""
|
|
36
|
+
from vector_inspector.ui.views.info_panel import InfoPanel
|
|
37
|
+
from vector_inspector.ui.views.metadata_view import MetadataView
|
|
38
|
+
from vector_inspector.ui.views.search_view import SearchView
|
|
39
|
+
from vector_inspector.ui.views.visualization_view import VisualizationView
|
|
40
|
+
|
|
41
|
+
return [
|
|
42
|
+
TabDefinition("Info", InfoPanel, lazy_load=False),
|
|
43
|
+
TabDefinition("Data Browser", MetadataView, lazy_load=False),
|
|
44
|
+
TabDefinition("Search", SearchView, lazy_load=False),
|
|
45
|
+
TabDefinition("Visualization", VisualizationView, lazy_load=True),
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def create_tab_widget(tab_def: TabDefinition, connection=None) -> QWidget:
|
|
50
|
+
"""Create a widget instance from a tab definition.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
tab_def: Tab definition
|
|
54
|
+
connection: Optional connection to pass to widget
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Widget instance
|
|
58
|
+
"""
|
|
59
|
+
if tab_def.lazy_load:
|
|
60
|
+
# Return placeholder for lazy-loaded tabs
|
|
61
|
+
return QWidget()
|
|
62
|
+
else:
|
|
63
|
+
# Create widget with connection
|
|
64
|
+
return tab_def.widget_class(connection)
|
|
@@ -780,6 +780,78 @@ class MetadataView(QWidget):
|
|
|
780
780
|
# compute its page and load that page while selecting the row. This
|
|
781
781
|
# ensures the edited item becomes visible even if the backend moved it.
|
|
782
782
|
try:
|
|
783
|
+
# Quick in-place update: if the updated item is still on the
|
|
784
|
+
# currently-visible page, update the in-memory page and
|
|
785
|
+
# table cells and emit `dataChanged` so the view refreshes
|
|
786
|
+
# immediately without a full reload.
|
|
787
|
+
updated_id = updated_data.get("id")
|
|
788
|
+
if (
|
|
789
|
+
self.current_data
|
|
790
|
+
and self.current_data.get("ids")
|
|
791
|
+
and updated_id in self.current_data.get("ids", [])
|
|
792
|
+
):
|
|
793
|
+
try:
|
|
794
|
+
row_idx = self.current_data["ids"].index(updated_id)
|
|
795
|
+
|
|
796
|
+
# Update in-memory lists
|
|
797
|
+
if "documents" in self.current_data and row_idx < len(
|
|
798
|
+
self.current_data["documents"]
|
|
799
|
+
):
|
|
800
|
+
self.current_data["documents"][row_idx] = (
|
|
801
|
+
updated_data["document"] if updated_data["document"] else ""
|
|
802
|
+
)
|
|
803
|
+
if "metadatas" in self.current_data and row_idx < len(
|
|
804
|
+
self.current_data["metadatas"]
|
|
805
|
+
):
|
|
806
|
+
self.current_data["metadatas"][row_idx] = (
|
|
807
|
+
updated_data["metadata"] if updated_data["metadata"] else {}
|
|
808
|
+
)
|
|
809
|
+
|
|
810
|
+
# Update table cell text for document column
|
|
811
|
+
doc_text = (
|
|
812
|
+
str(self.current_data["documents"][row_idx])
|
|
813
|
+
if self.current_data["documents"][row_idx]
|
|
814
|
+
else ""
|
|
815
|
+
)
|
|
816
|
+
if len(doc_text) > 100:
|
|
817
|
+
doc_text = doc_text[:100] + "..."
|
|
818
|
+
self.table.setItem(row_idx, 1, QTableWidgetItem(doc_text))
|
|
819
|
+
|
|
820
|
+
# Update metadata columns based on current header names
|
|
821
|
+
metadata_keys = []
|
|
822
|
+
for col in range(2, self.table.columnCount()):
|
|
823
|
+
hdr = self.table.horizontalHeaderItem(col)
|
|
824
|
+
if hdr:
|
|
825
|
+
metadata_keys.append(hdr.text())
|
|
826
|
+
|
|
827
|
+
if "metadatas" in self.current_data:
|
|
828
|
+
meta = self.current_data["metadatas"][row_idx]
|
|
829
|
+
for col_idx, key in enumerate(metadata_keys, start=2):
|
|
830
|
+
value = meta.get(key, "")
|
|
831
|
+
self.table.setItem(
|
|
832
|
+
row_idx, col_idx, QTableWidgetItem(str(value))
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
# Emit dataChanged on the underlying model so views refresh
|
|
836
|
+
try:
|
|
837
|
+
model = self.table.model()
|
|
838
|
+
top = model.index(row_idx, 0)
|
|
839
|
+
bottom = model.index(row_idx, self.table.columnCount() - 1)
|
|
840
|
+
model.dataChanged.emit(top, bottom, [Qt.DisplayRole, Qt.EditRole])
|
|
841
|
+
except Exception:
|
|
842
|
+
pass
|
|
843
|
+
|
|
844
|
+
# Restore selection/scroll and return
|
|
845
|
+
self.table.verticalScrollBar().setValue(
|
|
846
|
+
self.table.verticalScrollBar().value()
|
|
847
|
+
)
|
|
848
|
+
self.table.selectRow(row_idx)
|
|
849
|
+
self.table.scrollToItem(self.table.item(row_idx, 0))
|
|
850
|
+
return
|
|
851
|
+
except Exception:
|
|
852
|
+
# Fall through to server-side search if in-place update fails
|
|
853
|
+
pass
|
|
854
|
+
|
|
783
855
|
server_filter = None
|
|
784
856
|
if self.filter_group.isChecked() and self.filter_builder.has_filters():
|
|
785
857
|
server_filter, _ = self.filter_builder.get_filters_split()
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
APP_VERSION = "0.3.3" # Update this when pyproject.toml version changes
|
|
2
|
-
|
|
3
|
-
|
|
4
1
|
def get_app_version():
|
|
5
|
-
|
|
2
|
+
try:
|
|
3
|
+
from importlib.metadata import version, PackageNotFoundError
|
|
4
|
+
except ImportError:
|
|
5
|
+
try:
|
|
6
|
+
from importlib_metadata import version, PackageNotFoundError # type: ignore
|
|
7
|
+
except ImportError:
|
|
8
|
+
return "?"
|
|
9
|
+
try:
|
|
10
|
+
return version("vector-inspector")
|
|
11
|
+
except PackageNotFoundError:
|
|
12
|
+
return "?"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vector-inspector
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.8
|
|
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
|
|
@@ -31,9 +31,31 @@ Requires-Dist: pgvector>=0.4.2
|
|
|
31
31
|
Description-Content-Type: text/markdown
|
|
32
32
|
|
|
33
33
|
# Latest updates
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
|
|
35
|
+
## Vector Inspector 2026.01 Release Notes
|
|
36
|
+
|
|
37
|
+
### Major Refactor and Studio-Ready Architecture
|
|
38
|
+
- Refactored main window into modular components:
|
|
39
|
+
- InspectorShell: reusable UI shell (splitter, tabs, layout)
|
|
40
|
+
- ProviderFactory: centralized connection creation
|
|
41
|
+
- DialogService: dialog management
|
|
42
|
+
- ConnectionController: connection lifecycle and threading
|
|
43
|
+
- InspectorTabs: pluggable tab registry
|
|
44
|
+
- MainWindow now inherits from InspectorShell and is fully reusable as a widget
|
|
45
|
+
- Bootstrap logic is separated from UI logic—Studio can host Inspector as a component
|
|
46
|
+
- Tab system is now pluggable: Studio and Inspector can add, remove, or override tabs via TabDefinition
|
|
47
|
+
- All Inspector UI logic is self-contained; Studio can extend without modifying Inspector code
|
|
48
|
+
|
|
49
|
+
### Data Browser Improvements
|
|
50
|
+
- Added a checkbox: Generate embeddings on edit (default: checked)
|
|
51
|
+
- When unchecked, editing a row skips embedding regeneration
|
|
52
|
+
- Setting is persisted per user
|
|
53
|
+
|
|
54
|
+
### Developer and Architecture Notes
|
|
55
|
+
- All modules pass syntax checks and are ready for Studio integration
|
|
56
|
+
- No breaking changes for existing Inspector users
|
|
57
|
+
- Inspector is now a true UI module, not just an application
|
|
58
|
+
|
|
37
59
|
---
|
|
38
60
|
|
|
39
61
|
# Vector Inspector
|
|
@@ -41,7 +63,7 @@ Description-Content-Type: text/markdown
|
|
|
41
63
|
> **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.
|
|
42
64
|
|
|
43
65
|
[](https://github.com/anthonypdawson/vector-inspector/actions/workflows/ci-tests.yml)
|
|
44
|
-
[](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish.yml)
|
|
66
|
+
[](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish%20copy.yml)
|
|
45
67
|
|
|
46
68
|
[](https://pypi.org/project/vector-inspector/)
|
|
47
69
|
[](https://pepy.tech/projects/vector-inspector)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
vector_inspector-0.3.
|
|
2
|
-
vector_inspector-0.3.
|
|
3
|
-
vector_inspector-0.3.
|
|
1
|
+
vector_inspector-0.3.8.dist-info/METADATA,sha256=efuN0ywBf5QkEwGbRDiOV9YHG9pLNdBWBqnHPDsqUg0,11574
|
|
2
|
+
vector_inspector-0.3.8.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
|
|
3
|
+
vector_inspector-0.3.8.dist-info/entry_points.txt,sha256=u96envMI2NFImZUJDFutiiWl7ZoHrrev9joAgtyvTxo,80
|
|
4
4
|
vector_inspector/__init__.py,sha256=Q8XbXn98o0eliQWPePhy-aGUz2KNnVg7bQq-sBPl7zQ,119
|
|
5
5
|
vector_inspector/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
|
|
6
6
|
vector_inspector/config/__init__.py,sha256=vHkVsXSUdInsfzWSOLPZzaaELa3SGenAgfpY5EYbsYA,95
|
|
@@ -10,10 +10,10 @@ vector_inspector/core/cache_manager.py,sha256=cHdbIYR-eS9vLLTqvq4Xejyi5Z7Fm9DqMh
|
|
|
10
10
|
vector_inspector/core/connection_manager.py,sha256=xNmgSXqJcMC-iaOY33-Xnfxq4QjUN4CuwppPjzhn3DY,9958
|
|
11
11
|
vector_inspector/core/connections/__init__.py,sha256=lDZ-Qv-CbBvVcSlT8K2824zojovEIKhykHVSLARHZWs,345
|
|
12
12
|
vector_inspector/core/connections/base_connection.py,sha256=jDA1cEeNbTghqcCZYoLRpRPXIUteU5mSdpKcjvr4JQI,12236
|
|
13
|
-
vector_inspector/core/connections/chroma_connection.py,sha256=
|
|
14
|
-
vector_inspector/core/connections/pgvector_connection.py,sha256=
|
|
15
|
-
vector_inspector/core/connections/pinecone_connection.py,sha256=
|
|
16
|
-
vector_inspector/core/connections/qdrant_connection.py,sha256=
|
|
13
|
+
vector_inspector/core/connections/chroma_connection.py,sha256=Mks17olaHIxvJAdCVB6EoQa5Tj7ScoD3_b2--Ra0Owk,21006
|
|
14
|
+
vector_inspector/core/connections/pgvector_connection.py,sha256=7xzS3WRaa8IMt-RMU056kzxqiu2SLPgYxDMz_Xw5LVc,43812
|
|
15
|
+
vector_inspector/core/connections/pinecone_connection.py,sha256=V6nHLB6DXfQJG8LiH1uPtWFs6otACkaNxeYrM0uY0AQ,26954
|
|
16
|
+
vector_inspector/core/connections/qdrant_connection.py,sha256=GkLmnwnswakSMRM16pmtjkR6QXBszDhvg-aKhmI9jxw,31958
|
|
17
17
|
vector_inspector/core/connections/qdrant_helpers/__init__.py,sha256=u2YNjiW4sbNtqhTNOQr4hmOFqirlNlllsyBK2gWs9eU,262
|
|
18
18
|
vector_inspector/core/connections/qdrant_helpers/qdrant_embedding_resolver.py,sha256=9lQrVnjIDH2YyMMZwHdAtcSeWhNwUDrmMkFik3xWvGU,1547
|
|
19
19
|
vector_inspector/core/connections/qdrant_helpers/qdrant_filter_builder.py,sha256=WebqoWXuejaRUhpNTrEqf2JPG3BRQGhkz1HG82jBqLc,2514
|
|
@@ -26,6 +26,7 @@ vector_inspector/core/embedding_providers/sentence_transformer_provider.py,sha25
|
|
|
26
26
|
vector_inspector/core/embedding_utils.py,sha256=UCnJllDS_YPqbOPVo_kxSCUxM64C5tmcH-fuU9IUifQ,5558
|
|
27
27
|
vector_inspector/core/logging.py,sha256=HQ6_OZgZmaS3OMFOTAqc0oRbZujqo1W0w8OU4viXP1g,845
|
|
28
28
|
vector_inspector/core/model_registry.py,sha256=fdofceD3iyNpECVC7djTEAaDYgHX_7JQ3ROh5A0plpY,6269
|
|
29
|
+
vector_inspector/core/provider_factory.py,sha256=QFDpJTOBJVYAdOLlY0GxSWl87Yj_UT9ZzOm9cjVsGMU,3924
|
|
29
30
|
vector_inspector/main.py,sha256=iZeMPH94q6Ma92hWQLJ7on3rwxytUoS0V8n9MkAuEaY,595
|
|
30
31
|
vector_inspector/services/__init__.py,sha256=QLgH7oybjHuEYDFNiBgmJxvSpgAzHEuBEPXa3SKJb_I,67
|
|
31
32
|
vector_inspector/services/backup_helpers.py,sha256=aX1ONFegERq6dpoNM1eJrbyE1gWCV3SuUHMyPpnxrYM,2005
|
|
@@ -35,6 +36,7 @@ vector_inspector/services/filter_service.py,sha256=xDrMxNWsYzRcR1n0Fd-yp6Fo-4aLb
|
|
|
35
36
|
vector_inspector/services/import_export_service.py,sha256=4NOfAa6ZyvMyj5cDM4xu0Wqx0pgnK3cCNBGo3E6j4LE,10200
|
|
36
37
|
vector_inspector/services/profile_service.py,sha256=AMeC6XOfI6Qumi0bKlTbqU-czMcle0rrHYK68ceK5r8,12856
|
|
37
38
|
vector_inspector/services/settings_service.py,sha256=YfuPK4VIn7Kd36dpGsgzLAJw3fGybopDUcHhR30GSaY,7692
|
|
39
|
+
vector_inspector/services/update_service.py,sha256=B_l0qQUe0L_rYWNYnqvXET4UNf6bCSsl2LTkINtp0GE,2771
|
|
38
40
|
vector_inspector/services/visualization_service.py,sha256=9TOK1S1u1U74wLpF5NdDiryyrjOzFnvE8kwjugf95Wk,4208
|
|
39
41
|
vector_inspector/ui/__init__.py,sha256=262ZiXO6Luk8vZnhCIoYxOtGiny0bXK-BTKjxUNBx-w,43
|
|
40
42
|
vector_inspector/ui/components/__init__.py,sha256=S-GWU1P820dJ6mHmeeBEy-CGF9fjpBeNf8vrbhRlFMk,30
|
|
@@ -44,20 +46,27 @@ vector_inspector/ui/components/filter_builder.py,sha256=NSR_hp-rzUZVAca6dIJhTxZA
|
|
|
44
46
|
vector_inspector/ui/components/item_dialog.py,sha256=VMwehEjQ6xrdxWygR9J-hHsLfzOVb_E3ePUGYO_c7XA,3951
|
|
45
47
|
vector_inspector/ui/components/loading_dialog.py,sha256=YEKYGU-R-Zz4CjXSArJtkNxgTy4O9hI5Bbt6qlIzD8U,1018
|
|
46
48
|
vector_inspector/ui/components/profile_manager_panel.py,sha256=U-Ea6KC97ltj7bYtG4h9Okb97SbfBAvH1SusbYHTn1o,27930
|
|
47
|
-
vector_inspector/ui/components/splash_window.py,sha256=
|
|
49
|
+
vector_inspector/ui/components/splash_window.py,sha256=AYuRRdLfnuS3ueMSCLfpGG4Q348g_uDIGRyhK4ovzzU,2507
|
|
50
|
+
vector_inspector/ui/components/update_details_dialog.py,sha256=IQl4QZ30tHHOFay68qGOajQ6JuOB85plNoEazzMYS6k,1587
|
|
51
|
+
vector_inspector/ui/controllers/__init__.py,sha256=Wrc4GsLBbIU3FFk9py9URcblNCp-auGAAT1XPi20nWY,53
|
|
52
|
+
vector_inspector/ui/controllers/connection_controller.py,sha256=cx5Vgdn7cleMeJdUewDHd4NXSMmPUOFDwxQQVArfXuE,6494
|
|
48
53
|
vector_inspector/ui/dialogs/__init__.py,sha256=xtT77L91PFfm3zHYRENHkWHJaKPm1htuUzRXAF53P8w,211
|
|
49
54
|
vector_inspector/ui/dialogs/cross_db_migration.py,sha256=BaUyic8l5Ywwql2hQyxVrCXHMjGtqerNAQHDYxcbQ54,15872
|
|
50
55
|
vector_inspector/ui/dialogs/embedding_config_dialog.py,sha256=1K5LBSBXp590BvKwtHx9qgPwGREsn1mJ8cjFGSZHnMA,12926
|
|
51
56
|
vector_inspector/ui/dialogs/provider_type_dialog.py,sha256=W_FAJuvicwBUJJ7PyvKow9lc8_a5pnE3RIAsh-DVndQ,6809
|
|
52
|
-
vector_inspector/ui/main_window.py,sha256=
|
|
57
|
+
vector_inspector/ui/main_window.py,sha256=mZfUm29Ur-dfR4pbHXRSaDsQmIHFY1_SfOahHE_o1DI,21493
|
|
58
|
+
vector_inspector/ui/main_window_shell.py,sha256=0o4KxRc4KXu-mJxni9dv74a5DzP4OIvJoLTX7BLqDoo,3425
|
|
59
|
+
vector_inspector/ui/services/__init__.py,sha256=m2DGkhYlcQQGMtNQsup5eKmhCFhOhXHi-g9Hw0GH1vE,55
|
|
60
|
+
vector_inspector/ui/services/dialog_service.py,sha256=1NHWSMvNadcmoh8tgUMSa8N7g8xYDOTaWMr1G8i9e8A,4261
|
|
61
|
+
vector_inspector/ui/tabs.py,sha256=nniOLax93udxFt1t3s-kx1BpguXBEiDUmC1HA9J-scw,2071
|
|
53
62
|
vector_inspector/ui/views/__init__.py,sha256=FeMtVzSbVFBMjdwLQSQqD0FRW4ieJ4ZKXtTBci2e_bw,30
|
|
54
63
|
vector_inspector/ui/views/collection_browser.py,sha256=oG9_YGPoVuMs-f_zSd4EcITmEU9caxvwuubsFUrNf-c,3991
|
|
55
64
|
vector_inspector/ui/views/connection_view.py,sha256=3oGbClqwpVuUD3AIT8TuM-8heDvwMYw7RowHT3b1b8o,23749
|
|
56
65
|
vector_inspector/ui/views/info_panel.py,sha256=6LwOQFmRdFOcNZo_BcZ8DZ5a5GTdGLwO2IIHqYWNBdQ,26179
|
|
57
|
-
vector_inspector/ui/views/metadata_view.py,sha256=
|
|
66
|
+
vector_inspector/ui/views/metadata_view.py,sha256=75ITKS-DPw1GVUBWI1ppTbADb5Ka4d82wPhM7iFxDGo,45776
|
|
58
67
|
vector_inspector/ui/views/search_view.py,sha256=LFGmbyVoB04bE6KX-Gt-WYmFrFfnMy808iHWiWVH-gU,12291
|
|
59
68
|
vector_inspector/ui/views/visualization_view.py,sha256=wgkSkOM-ShOHDj1GCUtKnqH87Io5vYtiOdubGV5rN44,11050
|
|
60
69
|
vector_inspector/utils/__init__.py,sha256=jhHBQC8C8bfhNlf6CAt07ejjStp_YAyleaYr2dm0Dk0,38
|
|
61
70
|
vector_inspector/utils/lazy_imports.py,sha256=2XZ3ZnwTvZ5vvrh36nJ_TUjwwkgjoAED6i6P9yctvt0,1211
|
|
62
|
-
vector_inspector/utils/version.py,sha256=
|
|
63
|
-
vector_inspector-0.3.
|
|
71
|
+
vector_inspector/utils/version.py,sha256=2Xk9DEKlDRGEszNNiYnK7ps1i3OH56H2uZhR0_yZORs,382
|
|
72
|
+
vector_inspector-0.3.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|