pyvectorhound 1.1.1__tar.gz → 1.4.0__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.
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/.github/workflows/ci.yml +5 -5
- pyvectorhound-1.4.0/CHANGELOG.md +180 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/Cargo.lock +2 -2
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/Cargo.toml +2 -2
- pyvectorhound-1.4.0/DASHBOARD_SHORTCUTS.md +161 -0
- pyvectorhound-1.4.0/DEPLOYMENT.md +673 -0
- pyvectorhound-1.4.0/LICENSE +22 -0
- pyvectorhound-1.4.0/OTEL_SETUP_GUIDE.md +319 -0
- pyvectorhound-1.4.0/PKG-INFO +356 -0
- pyvectorhound-1.4.0/PRODUCTION_DEPLOYMENT.md +512 -0
- pyvectorhound-1.4.0/README.md +294 -0
- pyvectorhound-1.4.0/USER_GUIDE.md +609 -0
- pyvectorhound-1.4.0/docs/PRODUCT_VISION.md +95 -0
- pyvectorhound-1.4.0/docs/ROADMAP.md +197 -0
- pyvectorhound-1.4.0/examples/benchmarking_and_trends.py +211 -0
- pyvectorhound-1.4.0/examples/mcp_pyvectorhound.py +27 -0
- pyvectorhound-1.4.0/examples/retrieval_debug.py +106 -0
- pyvectorhound-1.4.0/otel_exporter.py +189 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyproject.toml +20 -19
- pyvectorhound-1.4.0/pyvectorhound/__init__.py +123 -0
- pyvectorhound-1.4.0/pyvectorhound/_mcp_connector.py +105 -0
- pyvectorhound-1.4.0/pyvectorhound/_mcp_tools.py +321 -0
- pyvectorhound-1.4.0/pyvectorhound/_retry.py +50 -0
- pyvectorhound-1.4.0/pyvectorhound/advanced_analytics.py +439 -0
- pyvectorhound-1.4.0/pyvectorhound/benchmarking.py +401 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/cli.py +12 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/comparison.py +74 -36
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/database.py +77 -24
- pyvectorhound-1.4.0/pyvectorhound/db_adapters.py +549 -0
- pyvectorhound-1.4.0/pyvectorhound/diagnosis.py +568 -0
- pyvectorhound-1.4.0/pyvectorhound/hound.py +564 -0
- pyvectorhound-1.4.0/pyvectorhound/langchain_integration.py +388 -0
- pyvectorhound-1.4.0/pyvectorhound/llamaindex_integration.py +470 -0
- pyvectorhound-1.4.0/pyvectorhound/otel_integration.py +469 -0
- pyvectorhound-1.4.0/pyvectorhound/recommendations.py +570 -0
- pyvectorhound-1.4.0/pyvectorhound/retrieval_replay.py +446 -0
- pyvectorhound-1.4.0/pyvectorhound/retrieval_tracing.py +423 -0
- pyvectorhound-1.4.0/pyvectorhound/scorer.py +263 -0
- pyvectorhound-1.4.0/pyvectorhound/scripts/__init__.py +0 -0
- pyvectorhound-1.4.0/pyvectorhound/scripts/post_install.py +24 -0
- pyvectorhound-1.4.0/pyvectorhound/scripts/setup_shortcuts.sh +35 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/server.py +15 -1
- pyvectorhound-1.4.0/pyvectorhound/trend_analysis.py +526 -0
- pyvectorhound-1.4.0/pyvectorhound/web_dashboard.py +501 -0
- pyvectorhound-1.4.0/pyvectorhound.toml +22 -0
- pyvectorhound-1.4.0/scripts/setup_shortcuts.sh +30 -0
- pyvectorhound-1.4.0/scripts/test_dashboards_crossplatform.sh +208 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/src/lib.rs +3 -4
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/src/metrics.rs +6 -6
- pyvectorhound-1.4.0/src/retrieval_ranking.rs +280 -0
- pyvectorhound-1.4.0/tests/test_benchmarking.py +307 -0
- pyvectorhound-1.4.0/tests/test_database_adapters.py +191 -0
- pyvectorhound-1.4.0/tests/test_diagnosis.py +333 -0
- pyvectorhound-1.4.0/tests/test_hound.py +223 -0
- pyvectorhound-1.4.0/tests/test_recommendations.py +335 -0
- pyvectorhound-1.4.0/tests/test_retrieval_replay.py +381 -0
- pyvectorhound-1.4.0/tests/test_scorer.py +138 -0
- pyvectorhound-1.4.0/tests/test_trend_analysis.py +414 -0
- pyvectorhound-1.4.0/tests/test_v05_integrations.py +336 -0
- pyvectorhound-1.1.1/CHANGELOG.md +0 -41
- pyvectorhound-1.1.1/LICENSE +0 -21
- pyvectorhound-1.1.1/PKG-INFO +0 -693
- pyvectorhound-1.1.1/README.md +0 -632
- pyvectorhound-1.1.1/ROADMAP.md +0 -73
- pyvectorhound-1.1.1/examples/retrieval_debug.py +0 -38
- pyvectorhound-1.1.1/pyvectorhound/__init__.py +0 -58
- pyvectorhound-1.1.1/pyvectorhound/diagnosis.py +0 -303
- pyvectorhound-1.1.1/pyvectorhound/hound.py +0 -230
- pyvectorhound-1.1.1/pyvectorhound/scorer.py +0 -199
- pyvectorhound-1.1.1/tests/test_diagnosis.py +0 -74
- pyvectorhound-1.1.1/tests/test_hound.py +0 -55
- pyvectorhound-1.1.1/tests/test_vector_operations.py +0 -291
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/.github/dependabot.yml +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/.gitignore +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/.pre-commit-config.yaml +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/ARCHITECTURE.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/CODE_OF_CONDUCT.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/CONTRIBUTING.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/Makefile +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/OKF_INTEGRATION.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/SECURITY.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/ARCHITECTURE.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/GUIDE.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PYHOUND_FINAL_STATUS.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PyHound_COMPETITIVE_ROADMAP.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PyHound_FINAL_PRODUCT.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PyHound_GITHUB_LAUNCH.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PyHound_LAUNCH_CHECKLIST.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PyHound_UNIFICATION_STRATEGY.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/docs/strategy/PyHound_vs_Observability.md +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/install.sh +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/_safe_exec.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/backends.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/error_messages.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/errors.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/logging_config.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/okf_diagnostics.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/py.typed +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/pyvectorhound/validation.py +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/rust-toolchain.toml +0 -0
- {pyvectorhound-1.1.1 → pyvectorhound-1.4.0}/tests/test_okf_diagnostics.py +0 -0
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
steps:
|
|
14
14
|
- uses: actions/checkout@v4
|
|
15
15
|
|
|
16
|
-
- uses: dtolnay/rust-toolchain@
|
|
16
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
17
17
|
|
|
18
18
|
- uses: Swatinem/rust-cache@v2
|
|
19
19
|
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
steps:
|
|
33
33
|
- uses: actions/checkout@v4
|
|
34
34
|
|
|
35
|
-
- uses: dtolnay/rust-toolchain@
|
|
35
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
36
36
|
|
|
37
37
|
- uses: Swatinem/rust-cache@v2
|
|
38
38
|
|
|
@@ -40,8 +40,8 @@ jobs:
|
|
|
40
40
|
with:
|
|
41
41
|
python-version: ${{ matrix.python-version }}
|
|
42
42
|
|
|
43
|
-
- name: Install dependencies
|
|
44
|
-
run:
|
|
43
|
+
- name: Install package + dev dependencies
|
|
44
|
+
run: pip install -e ".[dev]"
|
|
45
45
|
|
|
46
46
|
- name: Run pytest
|
|
47
|
-
run:
|
|
47
|
+
run: pytest tests/ -v --tb=short
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to PyVectorHound are documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.4.0]
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **LLM-as-judge faithfulness / semantic contradiction scoring.** `Diagnosis`
|
|
10
|
+
accepts optional `document_texts` (doc_id -> text) and `llm_judge_fn`
|
|
11
|
+
(`(query, doc_texts) -> dict`) — mirrors the existing `embed_fn` pattern,
|
|
12
|
+
no LLM client bundled. Adds a `faithfulness` component to
|
|
13
|
+
`metrics()`/`hunt()`/`recommendations()`/`root_cause()` that catches
|
|
14
|
+
retrieved documents that are embedding-similar but semantically
|
|
15
|
+
contradict or are irrelevant to the query, a failure mode distance
|
|
16
|
+
metrics alone can't see. Reports `UNKNOWN` honestly when the required
|
|
17
|
+
inputs aren't supplied.
|
|
18
|
+
- **`Hound.diagnose_batch()`** — runs many queries concurrently on a thread
|
|
19
|
+
pool instead of serially, for large-scale evaluation runs. `embed_fn`
|
|
20
|
+
and `llm_judge_fn` calls now retry with exponential backoff + jitter
|
|
21
|
+
(`pyvectorhound/_retry.py`).
|
|
22
|
+
- **Dynamic threshold calibration.** `scorer.py` and `diagnosis.py`'s
|
|
23
|
+
GOOD/MODERATE/WEAK quality-status cutoffs now classify relative to a
|
|
24
|
+
tracked `TrendAnalyzer` baseline (z-score based) when one is available,
|
|
25
|
+
instead of a fixed numeric cutoff — so status doesn't silently drift
|
|
26
|
+
when you swap embedding models. Falls back to the original fixed
|
|
27
|
+
cutoffs on cold start (no baseline yet). `Hound.diagnose()` and
|
|
28
|
+
`Hound.quality_scorer()` wire this up automatically.
|
|
29
|
+
|
|
30
|
+
## [1.3.3] - Unreleased
|
|
31
|
+
|
|
32
|
+
This release reconciles two independent fix passes that diverged from the
|
|
33
|
+
same base commit (`165cc80`) without knowledge of each other:
|
|
34
|
+
|
|
35
|
+
1. The repo owner's own prior work (now `1.3.2`, below): the v1.3 retrieval
|
|
36
|
+
ranking feature, a real Milvus `get_embeddings`, and a fix for the
|
|
37
|
+
`_core` extension / fabricated-diagnosis bug.
|
|
38
|
+
2. A separate remediation pass, done from a stale local clone that had not
|
|
39
|
+
pulled (1), which fixed the *same* `_core`/fabrication bug independently
|
|
40
|
+
(briefly published to PyPI as `1.3.0` before this reconciliation) and
|
|
41
|
+
also fixed a number of other, non-overlapping fabrication bugs the
|
|
42
|
+
`1.3.2` pass didn't touch.
|
|
43
|
+
|
|
44
|
+
Where both passes fixed the same thing (`diagnosis.py`, `scorer.py`,
|
|
45
|
+
`src/lib.rs`'s `_core` symbol, the `pyhound` import), `1.3.2`'s
|
|
46
|
+
implementation was kept as authoritative and the duplicate was discarded.
|
|
47
|
+
Everything below is what pass (2) fixed that pass (1) did not; it's applied
|
|
48
|
+
on top of `1.3.2` unchanged.
|
|
49
|
+
|
|
50
|
+
### Fixed
|
|
51
|
+
- `Hound.diagnose()` fabricated the query embedding: a query with no
|
|
52
|
+
`query_embedding` got `np.random.randn(768)`, silently producing a
|
|
53
|
+
meaningless diagnosis dressed up with real-looking metrics. It now
|
|
54
|
+
requires a `query_embedding` or a configured `embed_fn` and raises a
|
|
55
|
+
clear `ValueError` otherwise. **Breaking change** for callers that relied
|
|
56
|
+
on the old silent random-vector fallback; `tests/test_hound.py` was
|
|
57
|
+
updated to assert the new behavior (and a new `embed_fn`-path test) in
|
|
58
|
+
place of the old test that asserted the fabricated vector was generated.
|
|
59
|
+
- `Hound.__init__` eagerly called `adapter.connect()`, requiring the
|
|
60
|
+
optional client library and a live server just to construct a `Hound`.
|
|
61
|
+
Connection is now lazy, matching every adapter method's own
|
|
62
|
+
lazy-connect behavior.
|
|
63
|
+
- Database adapters' `search()` (Qdrant, Chroma, Milvus, pgvector,
|
|
64
|
+
Weaviate) returned the *query* embedding as every result's `"embedding"`
|
|
65
|
+
field instead of the real per-document vector, corrupting any downstream
|
|
66
|
+
embedding-space analysis that reads it directly from search results.
|
|
67
|
+
They now fetch and return the actual per-document embedding where the
|
|
68
|
+
underlying client supports it. (Milvus's `search()` additionally now
|
|
69
|
+
requests `vector_field`/`id_field` per `1.3.2`'s configurable field
|
|
70
|
+
names, alongside this fix.)
|
|
71
|
+
- `pydantic` is used in `database.py` (`SecretStr`) but was missing from
|
|
72
|
+
`pyproject.toml` dependencies, so a clean install could fail on import
|
|
73
|
+
if pydantic wasn't already present transitively. Added as a dependency.
|
|
74
|
+
Also moved the `from pydantic import SecretStr` statement below the
|
|
75
|
+
module docstring -- it previously preceded it, which silently discarded
|
|
76
|
+
the module's `__doc__`.
|
|
77
|
+
- Base and optional dependencies were pinned to exact old versions (e.g.
|
|
78
|
+
`numpy==1.20.0`, `black==23.0.0`) with no compatible wheels for some of
|
|
79
|
+
the Python versions this package claims to support (3.8-3.12), breaking
|
|
80
|
+
`pip install .[dev]`. Relaxed to compatible ranges.
|
|
81
|
+
- CI's Python test job referenced a nonexistent `python/` subdirectory and
|
|
82
|
+
never built the Rust extension via `maturin`, so it always ran against
|
|
83
|
+
whatever `_core` state happened to exist (or silently skipped tests
|
|
84
|
+
entirely). It now runs `maturin develop --release` before installing
|
|
85
|
+
dependencies and running pytest, at the actual repo root.
|
|
86
|
+
- Adapter `ImportError` messages told users to `pip install pyhound[...]`
|
|
87
|
+
-- `pyhound` is this project's old name and is not the installable
|
|
88
|
+
package; corrected to `pyvectorhound[...]` across all five adapters.
|
|
89
|
+
- `ModelComparison`/`Hound.compare_models()` fabricated quality scores
|
|
90
|
+
(`f1_score`, `ndcg`, etc.) derived from `hash(model_name)`. It now
|
|
91
|
+
reports only real, published cost/latency metadata unless a `quality_fn`
|
|
92
|
+
is supplied for real, measured quality numbers; unmeasured quality is
|
|
93
|
+
reported as `None` with `quality_measured: False` rather than a fake
|
|
94
|
+
number.
|
|
95
|
+
- `Hound.compare_metrics()` and `Hound.detect_drift()` returned fixed
|
|
96
|
+
placeholder output (zeros / `"No action needed"`) regardless of input,
|
|
97
|
+
with no backing data store. They now raise `NotImplementedError`
|
|
98
|
+
pointing at the real, tested alternative (`track_metric()` +
|
|
99
|
+
`get_trend_report()` / `TrendAnalyzer.detect_drift()`).
|
|
100
|
+
- Removed `tests/test_vector_operations.py`: it tested `VectorStore` and
|
|
101
|
+
`EmbeddingManager` classes that do not exist anywhere in this codebase
|
|
102
|
+
and are outside this package's scope (diagnosing failures in databases
|
|
103
|
+
you already run, not being one).
|
|
104
|
+
- Removed stale `README.md.bak` and `pyvectorhound/__init__.py.bak` files
|
|
105
|
+
left over from a previous edit.
|
|
106
|
+
- `pyvectorhound/diagnosis.py`'s `hunt()` report header still read
|
|
107
|
+
"PyHound Diagnosis Report" after the project's rename; corrected to
|
|
108
|
+
"PyVectorHound", with the matching test assertion updated.
|
|
109
|
+
- The CLI (`cli.py`) and REST server (`server.py`) never threaded
|
|
110
|
+
`query_embedding`/`embed_fn` through to `Hound.diagnose()`, so both would
|
|
111
|
+
hit the `ValueError` above unconditionally once the random-embedding
|
|
112
|
+
fallback was removed. Both now accept and forward a precomputed
|
|
113
|
+
`query_embedding`.
|
|
114
|
+
- `README.md` and `examples/retrieval_debug.py` described a fictional API
|
|
115
|
+
(`VectorHound`, `hound.validate_quality()`, `quality_score()`, DB
|
|
116
|
+
support for Pinecone/Elasticsearch that isn't implemented) instead of
|
|
117
|
+
the real `Hound`/`Diagnosis` classes. Rewritten to match the actual,
|
|
118
|
+
reconciled API, including `embed_fn` and lazy connection.
|
|
119
|
+
|
|
120
|
+
## [1.3.2] - Unreleased
|
|
121
|
+
|
|
122
|
+
### Fixed
|
|
123
|
+
- The compiled Rust scoring engine (`pyvectorhound._core`) could never actually load, for two independent reasons: (1) the `#[pymodule]` function was named `pyhound_core` in Rust while `Cargo.toml`/`pyproject.toml` both expect the extension's init symbol to be `_core`; (2) `diagnosis.py` and `scorer.py` imported it as `from pyhound import _core` -- `pyhound` was this project's old name before it was renamed to `pyvectorhound`, and that import was never updated. Both are fixed; `_core` now loads and its isotropy/coverage/distinctiveness/quality-score functions are actually reachable for the first time.
|
|
124
|
+
- `Diagnosis._analyze_embedding()` returned hardcoded placeholder numbers (isotropy 0.72, coverage 0.85, distinctiveness 0.68) and an unconditional `"GOOD"` status regardless of the actual retrieved documents. It now fetches the real per-document embeddings via `adapter.get_embeddings()` and computes real metrics via `_core`, honestly reporting `UNKNOWN` when there isn't enough real data to compute them (fewer than 2 embeddings, no adapter, or `_core` unavailable) rather than a fabricated score.
|
|
125
|
+
- `Diagnosis._analyze_vector_search()`'s MRR was a hardcoded `0.85 if any relevant doc was retrieved, else 0.0`, ignoring rank entirely. It's now a real reciprocal-rank calculation based on the position of the first relevant result.
|
|
126
|
+
- `Diagnosis._analyze_bm25()` and `_analyze_reranker()` unconditionally reported `"GOOD"` with fabricated precision/recall/calibration/NDCG numbers even though no BM25 index or reranker-score subsystem exists anywhere in this codebase. They now honestly report `UNKNOWN` with an explanation, instead of a fake positive verdict. `root_cause()`/`recommendations()` updated so they no longer misinterpret an honest `UNKNOWN` as a real quality problem.
|
|
127
|
+
- `QualityScorer.score()` computed a real `overall` score via `_core` but returned hardcoded `isotropy`/`coverage`/`distinctiveness`/`query_relevance` values alongside it regardless of the input embedding. It now samples real nearest-neighbor embeddings from the corpus via the adapter and computes all four metrics for real (or reports `UNKNOWN` if no adapter/corpus data is available, rather than a fake middling score).
|
|
128
|
+
- `QualityScorer.corpus_health()` returned fixed `avg_isotropy`/`avg_coverage`/`avg_distinctiveness`/`drift`/`trend` values regardless of the actual corpus. It now samples real corpus embeddings and computes real quality metrics; `drift`/`trend` honestly report as not-measured (this class doesn't persist historical snapshots) instead of a fabricated `"stable"`.
|
|
129
|
+
- `QualityScorer.trend_analysis()` returned a fixed `"stable"` direction and `0.02` magnitude for any date range, without looking at any data. It now honestly reports that no historical tracking is wired up, and points callers at `TrendAnalyzer` (which does real time-series tracking) instead.
|
|
130
|
+
- `__version__` in `pyvectorhound/__init__.py` was hardcoded to `"1.2.1"` and had drifted from the actual package version; now reads it from installed package metadata.
|
|
131
|
+
|
|
132
|
+
### Added
|
|
133
|
+
- Real test coverage in `tests/test_diagnosis.py` and new `tests/test_scorer.py` asserting the above methods respond to real input data instead of returning fixed constants.
|
|
134
|
+
|
|
135
|
+
### Fixed
|
|
136
|
+
- `MilvusAdapter.get_embeddings()` was a stub that unconditionally returned an empty dict, discarding the requested document IDs instead of querying Milvus. It now retrieves the real stored vectors via `MilvusClient.get()`, with configurable `vector_field`/`id_field` names to match the caller's collection schema.
|
|
137
|
+
- `MilvusAdapter.search()` used a hardcoded `"id"` output field instead of the configurable `id_field`.
|
|
138
|
+
- `pyproject.toml` was still at 1.2.1 while `Cargo.toml` had already moved to 1.3.0 in a prior commit; synced both.
|
|
139
|
+
|
|
140
|
+
### Added
|
|
141
|
+
- Real test coverage for `pyvectorhound/database.py`'s adapters (`MilvusAdapter`, `QdrantAdapter`, `ChromaAdapter`), which previously had zero tests — only the separate mock-based `db_adapters.py` interface was tested.
|
|
142
|
+
- Replaced two stub tests in `tests/test_hound.py` (`test_unsupported_db`, `test_diagnose`) that were empty `pass` statements with `# TODO` comments — they now actually exercise `Hound`'s real error path and its real adapter-search-to-Diagnosis flow.
|
|
143
|
+
|
|
144
|
+
## [0.1.1] - 2025-01-20
|
|
145
|
+
|
|
146
|
+
### Added
|
|
147
|
+
- Component-level diagnostics for retrieval pipelines
|
|
148
|
+
- Root cause analysis for embedding failures
|
|
149
|
+
- Recommendations engine with ROI estimates
|
|
150
|
+
- Support for Elasticsearch, Weaviate, and Pinecone
|
|
151
|
+
- BM25 keyword search diagnostics
|
|
152
|
+
- Reranker performance analysis
|
|
153
|
+
|
|
154
|
+
### Fixed
|
|
155
|
+
- Memory efficiency improvements in large batch processing
|
|
156
|
+
- Vector similarity computation accuracy
|
|
157
|
+
|
|
158
|
+
## [0.1.0] - 2024-12-15
|
|
159
|
+
|
|
160
|
+
### Added
|
|
161
|
+
- Initial release
|
|
162
|
+
- Core retrieval diagnostics engine
|
|
163
|
+
- Embedding quality assessment
|
|
164
|
+
- Vector search performance profiling
|
|
165
|
+
- MIT license
|
|
166
|
+
|
|
167
|
+
### Known Issues
|
|
168
|
+
- Streaming RAG pipelines not yet supported
|
|
169
|
+
- LLamaIndex integration in progress
|
|
170
|
+
|
|
171
|
+
## [Unreleased]
|
|
172
|
+
|
|
173
|
+
### Planned
|
|
174
|
+
- Streaming RAG support
|
|
175
|
+
- LLamaIndex integration
|
|
176
|
+
- Custom metric definitions
|
|
177
|
+
- Dashboard UI
|
|
178
|
+
- API server mode
|
|
179
|
+
|
|
180
|
+
For details, see [ROADMAP.md](../ROADMAP.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is automatically @generated by Cargo.
|
|
2
2
|
# It is not intended for manual editing.
|
|
3
|
-
version =
|
|
3
|
+
version = 4
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "autocfg"
|
|
@@ -218,7 +218,7 @@ dependencies = [
|
|
|
218
218
|
|
|
219
219
|
[[package]]
|
|
220
220
|
name = "pyvectorhound"
|
|
221
|
-
version = "1.
|
|
221
|
+
version = "1.4.0"
|
|
222
222
|
dependencies = [
|
|
223
223
|
"numpy",
|
|
224
224
|
"pyo3",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "pyvectorhound"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.4.0"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
authors = ["Georgi Mammen Mullassery <mullassery@gmail.com>"]
|
|
6
|
-
license = "
|
|
6
|
+
license = "Proprietary"
|
|
7
7
|
description = "Vector search diagnostics engine for RAG/LLM systems"
|
|
8
8
|
readme = "README.md"
|
|
9
9
|
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# 🎯 Dashboard Keyboard Shortcuts & Usage
|
|
2
|
+
|
|
3
|
+
## Auto-Start on Installation
|
|
4
|
+
|
|
5
|
+
The CLI dashboard **starts automatically** when you run the package for the first time or import it in Python:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
$ pip install [package]
|
|
9
|
+
# ✓ Dashboard appears in terminal automatically
|
|
10
|
+
|
|
11
|
+
$ python3 -c "from [package] import *"
|
|
12
|
+
# ✓ Dashboard initializes in background
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The dashboard runs in **persistent daemon mode** — if you close it, it restarts automatically with your keyboard shortcuts.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ⌨️ Keyboard Shortcuts
|
|
20
|
+
|
|
21
|
+
After installing the package, run:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
bash <(curl -s https://raw.githubusercontent.com/Mullassery/[PACKAGE]/main/scripts/setup_shortcuts.sh)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This adds aliases to your `~/.zshrc` or `~/.bashrc`:
|
|
28
|
+
|
|
29
|
+
### Quick Access (all packages)
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
dashboards # Show all available dashboard shortcuts
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Per-Package Shortcuts
|
|
36
|
+
|
|
37
|
+
Replace `[PACKAGE]` with any installed Mullassery package name:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
dash-[PACKAGE] # Static snapshot (single view)
|
|
41
|
+
dash-[PACKAGE]-live # Live dashboard (Ctrl+C to close)
|
|
42
|
+
dash-[PACKAGE]-export # Export metrics to JSON
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Examples
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# PyStreamAI
|
|
49
|
+
$ dash-pystreamai # View deployment metrics snapshot
|
|
50
|
+
$ dash-pystreamai-live # Watch real-time inference latency
|
|
51
|
+
$ dash-pystreamai-export # Save metrics for monitoring
|
|
52
|
+
|
|
53
|
+
# PyRoboReplay
|
|
54
|
+
$ dash-pyroboreplay # View RGB+Thermal fusion status
|
|
55
|
+
$ dash-pyroboreplay-live # Monitor decision reconstruction in real-time
|
|
56
|
+
$ dash-pyroboreplay-export # Export to Prometheus/Datadog
|
|
57
|
+
|
|
58
|
+
# PyTerrainMap
|
|
59
|
+
$ dash-pyterrainmap # View spatial layer metrics
|
|
60
|
+
$ dash-pyterrainmap-live # Watch fleet learning converge
|
|
61
|
+
$ dash-pyterrainmap-export # Save to /tmp/pyterrainmap_metrics.json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 🔄 Dashboard Modes
|
|
67
|
+
|
|
68
|
+
### Static Snapshot (`--static`)
|
|
69
|
+
```bash
|
|
70
|
+
$ dash-pystreamai # Single view, exits immediately
|
|
71
|
+
# Useful for: CI/CD logs, monitoring integration, one-time checks
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Live View (`--live`)
|
|
75
|
+
```bash
|
|
76
|
+
$ dash-pystreamai-live # Continuous updates until Ctrl+C
|
|
77
|
+
# Useful for: real-time monitoring, troubleshooting, development
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### JSON Export (`--export`)
|
|
81
|
+
```bash
|
|
82
|
+
$ dash-pystreamai-export # Saves to /tmp/pystreamai_metrics.json
|
|
83
|
+
# Useful for: integration with Prometheus, Datadog, custom dashboards
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 🛑 Remove Keyboard Shortcuts
|
|
89
|
+
|
|
90
|
+
To uninstall all dashboard aliases:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
bash <(curl -s https://raw.githubusercontent.com/Mullassery/[PACKAGE]/main/scripts/setup_shortcuts.sh) --remove
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This removes all `dash-*` aliases from your shell config.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 📊 Monitoring Integration
|
|
101
|
+
|
|
102
|
+
Export metrics for external monitoring systems:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Prometheus
|
|
106
|
+
$ dash-pystreamai-export > prometheus_metrics.txt
|
|
107
|
+
|
|
108
|
+
# Datadog (with custom agent)
|
|
109
|
+
$ dash-pystreamai-live | \
|
|
110
|
+
grep -o 'Status.*' | \
|
|
111
|
+
datadog-agent custom-metric
|
|
112
|
+
|
|
113
|
+
# JSON for custom dashboards
|
|
114
|
+
$ dash-pystreamai-export | jq '.metrics'
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## ❓ Troubleshooting
|
|
120
|
+
|
|
121
|
+
**Shortcuts not working?**
|
|
122
|
+
```bash
|
|
123
|
+
# Reload shell config
|
|
124
|
+
$ source ~/.zshrc # macOS/Linux (zsh)
|
|
125
|
+
$ source ~/.bashrc # Linux (bash)
|
|
126
|
+
|
|
127
|
+
# Or restart your terminal
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Dashboard won't start?**
|
|
131
|
+
```bash
|
|
132
|
+
# Ensure package is installed
|
|
133
|
+
$ pip list | grep pystreamai
|
|
134
|
+
|
|
135
|
+
# Start manually
|
|
136
|
+
$ pystreamai dashboard --static
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Dashboard keeps closing?**
|
|
140
|
+
```bash
|
|
141
|
+
# Use live mode (restarts automatically)
|
|
142
|
+
$ dash-pystreamai-live
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 📖 Package-Specific Shortcuts
|
|
148
|
+
|
|
149
|
+
The following Mullassery packages support dashboard shortcuts:
|
|
150
|
+
|
|
151
|
+
- ✅ PyStreamAI (deployment metrics)
|
|
152
|
+
- ✅ PyStreamMCP (tool orchestration)
|
|
153
|
+
- ✅ PyStreamPDF (document processing)
|
|
154
|
+
- ✅ PyStreamXL (formula extraction)
|
|
155
|
+
- ✅ StatGuardian (data quality)
|
|
156
|
+
- ✅ PyReverseETL (activation pipelines)
|
|
157
|
+
- ✅ PyTerrainMap (spatial analysis)
|
|
158
|
+
- ✅ PyRoboReplay (multi-modal fusion)
|
|
159
|
+
- ✅ PyRoboSimulator (world engine)
|
|
160
|
+
|
|
161
|
+
Run `dashboards` to see all available shortcuts.
|