pyvectorhound 1.3.0__tar.gz → 1.5.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.
Files changed (100) hide show
  1. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/.github/workflows/ci.yml +3 -9
  2. pyvectorhound-1.5.0/CHANGELOG.md +192 -0
  3. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/Cargo.lock +18 -29
  4. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/Cargo.toml +1 -2
  5. pyvectorhound-1.5.0/PKG-INFO +401 -0
  6. pyvectorhound-1.5.0/README.md +338 -0
  7. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/ROADMAP.md +5 -0
  8. pyvectorhound-1.5.0/examples/retrieval_debug.py +106 -0
  9. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyproject.toml +3 -2
  10. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/__init__.py +5 -1
  11. pyvectorhound-1.5.0/pyvectorhound/_retry.py +50 -0
  12. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/database.py +35 -8
  13. pyvectorhound-1.5.0/pyvectorhound/diagnosis.py +568 -0
  14. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/hound.py +111 -2
  15. pyvectorhound-1.5.0/pyvectorhound/scorer.py +263 -0
  16. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/scripts/setup_shortcuts.sh +0 -0
  17. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/scripts/setup_shortcuts.sh +0 -0
  18. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/scripts/test_dashboards_crossplatform.sh +0 -0
  19. pyvectorhound-1.5.0/src/lib.rs +196 -0
  20. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/src/metrics.rs +6 -6
  21. pyvectorhound-1.5.0/src/quantization.rs +300 -0
  22. pyvectorhound-1.5.0/src/retrieval_ranking.rs +280 -0
  23. pyvectorhound-1.5.0/tests/test_database_adapters.py +191 -0
  24. pyvectorhound-1.5.0/tests/test_diagnosis.py +333 -0
  25. pyvectorhound-1.5.0/tests/test_hound.py +223 -0
  26. pyvectorhound-1.5.0/tests/test_scorer.py +138 -0
  27. pyvectorhound-1.3.0/CHANGELOG.md +0 -110
  28. pyvectorhound-1.3.0/PKG-INFO +0 -213
  29. pyvectorhound-1.3.0/README.md +0 -151
  30. pyvectorhound-1.3.0/examples/retrieval_debug.py +0 -38
  31. pyvectorhound-1.3.0/pyvectorhound/diagnosis.py +0 -578
  32. pyvectorhound-1.3.0/pyvectorhound/scorer.py +0 -274
  33. pyvectorhound-1.3.0/src/lib.rs +0 -98
  34. pyvectorhound-1.3.0/tests/test_diagnosis.py +0 -74
  35. pyvectorhound-1.3.0/tests/test_hound.py +0 -55
  36. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  37. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  38. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/.github/dependabot.yml +0 -0
  39. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/.gitignore +0 -0
  40. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/.pre-commit-config.yaml +0 -0
  41. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/ARCHITECTURE.md +0 -0
  42. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/CODE_OF_CONDUCT.md +0 -0
  43. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/CONTRIBUTING.md +0 -0
  44. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/DASHBOARD_SHORTCUTS.md +0 -0
  45. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/DEPLOYMENT.md +0 -0
  46. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/LICENSE +0 -0
  47. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/Makefile +0 -0
  48. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/OKF_INTEGRATION.md +0 -0
  49. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/OTEL_SETUP_GUIDE.md +0 -0
  50. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/PRODUCTION_DEPLOYMENT.md +0 -0
  51. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/SECURITY.md +0 -0
  52. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/USER_GUIDE.md +0 -0
  53. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/ARCHITECTURE.md +0 -0
  54. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/GUIDE.md +0 -0
  55. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/PRODUCT_VISION.md +0 -0
  56. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PYHOUND_FINAL_STATUS.md +0 -0
  57. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PyHound_COMPETITIVE_ROADMAP.md +0 -0
  58. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PyHound_FINAL_PRODUCT.md +0 -0
  59. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PyHound_GITHUB_LAUNCH.md +0 -0
  60. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PyHound_LAUNCH_CHECKLIST.md +0 -0
  61. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PyHound_UNIFICATION_STRATEGY.md +0 -0
  62. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/docs/strategy/PyHound_vs_Observability.md +0 -0
  63. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/examples/benchmarking_and_trends.py +0 -0
  64. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/examples/mcp_pyvectorhound.py +0 -0
  65. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/install.sh +0 -0
  66. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/otel_exporter.py +0 -0
  67. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/_mcp_connector.py +0 -0
  68. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/_mcp_tools.py +0 -0
  69. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/_safe_exec.py +0 -0
  70. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/advanced_analytics.py +0 -0
  71. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/backends.py +0 -0
  72. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/benchmarking.py +0 -0
  73. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/cli.py +0 -0
  74. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/comparison.py +0 -0
  75. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/db_adapters.py +0 -0
  76. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/error_messages.py +0 -0
  77. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/errors.py +0 -0
  78. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/langchain_integration.py +0 -0
  79. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/llamaindex_integration.py +0 -0
  80. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/logging_config.py +0 -0
  81. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/okf_diagnostics.py +0 -0
  82. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/otel_integration.py +0 -0
  83. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/py.typed +0 -0
  84. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/recommendations.py +0 -0
  85. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/retrieval_replay.py +0 -0
  86. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/retrieval_tracing.py +0 -0
  87. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/scripts/__init__.py +0 -0
  88. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/scripts/post_install.py +0 -0
  89. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/server.py +0 -0
  90. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/trend_analysis.py +0 -0
  91. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/validation.py +0 -0
  92. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound/web_dashboard.py +0 -0
  93. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/pyvectorhound.toml +0 -0
  94. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/rust-toolchain.toml +0 -0
  95. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/tests/test_benchmarking.py +0 -0
  96. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/tests/test_okf_diagnostics.py +0 -0
  97. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/tests/test_recommendations.py +0 -0
  98. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/tests/test_retrieval_replay.py +0 -0
  99. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/tests/test_trend_analysis.py +0 -0
  100. {pyvectorhound-1.3.0 → pyvectorhound-1.5.0}/tests/test_v05_integrations.py +0 -0
@@ -13,7 +13,7 @@ jobs:
13
13
  steps:
14
14
  - uses: actions/checkout@v4
15
15
 
16
- - uses: dtolnay/rust-toolchain@v1
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@v1
35
+ - uses: dtolnay/rust-toolchain@stable
36
36
 
37
37
  - uses: Swatinem/rust-cache@v2
38
38
 
@@ -40,13 +40,7 @@ jobs:
40
40
  with:
41
41
  python-version: ${{ matrix.python-version }}
42
42
 
43
- - name: Install maturin
44
- run: pip install "maturin>=1.7,<2.0"
45
-
46
- - name: Build and install extension module
47
- run: maturin develop --release
48
-
49
- - name: Install dependencies
43
+ - name: Install package + dev dependencies
50
44
  run: pip install -e ".[dev]"
51
45
 
52
46
  - name: Run pytest
@@ -0,0 +1,192 @@
1
+ # Changelog
2
+
3
+ All notable changes to PyVectorHound are documented in this file.
4
+
5
+ ## [1.5.0]
6
+
7
+ ### Added
8
+
9
+ - **int8 scalar quantization** (`src/quantization.rs`) — per-vector min/max
10
+ linear quantization to `i8`, with `quantize`/`dequantize` (and batch
11
+ variants) exposed via PyO3. 4x memory reduction vs `f32` for large local
12
+ vector indices, with measured reconstruction error (0.0039 max on a
13
+ 384-dim `[-1,1]` test vector) within the theoretical 8-bit bound
14
+ (`range/255`). SIMD/GPU acceleration is a separate, larger effort and
15
+ intentionally out of scope here.
16
+
17
+ ## [1.4.0]
18
+
19
+ ### Added
20
+
21
+ - **LLM-as-judge faithfulness / semantic contradiction scoring.** `Diagnosis`
22
+ accepts optional `document_texts` (doc_id -> text) and `llm_judge_fn`
23
+ (`(query, doc_texts) -> dict`) — mirrors the existing `embed_fn` pattern,
24
+ no LLM client bundled. Adds a `faithfulness` component to
25
+ `metrics()`/`hunt()`/`recommendations()`/`root_cause()` that catches
26
+ retrieved documents that are embedding-similar but semantically
27
+ contradict or are irrelevant to the query, a failure mode distance
28
+ metrics alone can't see. Reports `UNKNOWN` honestly when the required
29
+ inputs aren't supplied.
30
+ - **`Hound.diagnose_batch()`** — runs many queries concurrently on a thread
31
+ pool instead of serially, for large-scale evaluation runs. `embed_fn`
32
+ and `llm_judge_fn` calls now retry with exponential backoff + jitter
33
+ (`pyvectorhound/_retry.py`).
34
+ - **Dynamic threshold calibration.** `scorer.py` and `diagnosis.py`'s
35
+ GOOD/MODERATE/WEAK quality-status cutoffs now classify relative to a
36
+ tracked `TrendAnalyzer` baseline (z-score based) when one is available,
37
+ instead of a fixed numeric cutoff — so status doesn't silently drift
38
+ when you swap embedding models. Falls back to the original fixed
39
+ cutoffs on cold start (no baseline yet). `Hound.diagnose()` and
40
+ `Hound.quality_scorer()` wire this up automatically.
41
+
42
+ ## [1.3.3] - Unreleased
43
+
44
+ This release reconciles two independent fix passes that diverged from the
45
+ same base commit (`165cc80`) without knowledge of each other:
46
+
47
+ 1. The repo owner's own prior work (now `1.3.2`, below): the v1.3 retrieval
48
+ ranking feature, a real Milvus `get_embeddings`, and a fix for the
49
+ `_core` extension / fabricated-diagnosis bug.
50
+ 2. A separate remediation pass, done from a stale local clone that had not
51
+ pulled (1), which fixed the *same* `_core`/fabrication bug independently
52
+ (briefly published to PyPI as `1.3.0` before this reconciliation) and
53
+ also fixed a number of other, non-overlapping fabrication bugs the
54
+ `1.3.2` pass didn't touch.
55
+
56
+ Where both passes fixed the same thing (`diagnosis.py`, `scorer.py`,
57
+ `src/lib.rs`'s `_core` symbol, the `pyhound` import), `1.3.2`'s
58
+ implementation was kept as authoritative and the duplicate was discarded.
59
+ Everything below is what pass (2) fixed that pass (1) did not; it's applied
60
+ on top of `1.3.2` unchanged.
61
+
62
+ ### Fixed
63
+ - `Hound.diagnose()` fabricated the query embedding: a query with no
64
+ `query_embedding` got `np.random.randn(768)`, silently producing a
65
+ meaningless diagnosis dressed up with real-looking metrics. It now
66
+ requires a `query_embedding` or a configured `embed_fn` and raises a
67
+ clear `ValueError` otherwise. **Breaking change** for callers that relied
68
+ on the old silent random-vector fallback; `tests/test_hound.py` was
69
+ updated to assert the new behavior (and a new `embed_fn`-path test) in
70
+ place of the old test that asserted the fabricated vector was generated.
71
+ - `Hound.__init__` eagerly called `adapter.connect()`, requiring the
72
+ optional client library and a live server just to construct a `Hound`.
73
+ Connection is now lazy, matching every adapter method's own
74
+ lazy-connect behavior.
75
+ - Database adapters' `search()` (Qdrant, Chroma, Milvus, pgvector,
76
+ Weaviate) returned the *query* embedding as every result's `"embedding"`
77
+ field instead of the real per-document vector, corrupting any downstream
78
+ embedding-space analysis that reads it directly from search results.
79
+ They now fetch and return the actual per-document embedding where the
80
+ underlying client supports it. (Milvus's `search()` additionally now
81
+ requests `vector_field`/`id_field` per `1.3.2`'s configurable field
82
+ names, alongside this fix.)
83
+ - `pydantic` is used in `database.py` (`SecretStr`) but was missing from
84
+ `pyproject.toml` dependencies, so a clean install could fail on import
85
+ if pydantic wasn't already present transitively. Added as a dependency.
86
+ Also moved the `from pydantic import SecretStr` statement below the
87
+ module docstring -- it previously preceded it, which silently discarded
88
+ the module's `__doc__`.
89
+ - Base and optional dependencies were pinned to exact old versions (e.g.
90
+ `numpy==1.20.0`, `black==23.0.0`) with no compatible wheels for some of
91
+ the Python versions this package claims to support (3.8-3.12), breaking
92
+ `pip install .[dev]`. Relaxed to compatible ranges.
93
+ - CI's Python test job referenced a nonexistent `python/` subdirectory and
94
+ never built the Rust extension via `maturin`, so it always ran against
95
+ whatever `_core` state happened to exist (or silently skipped tests
96
+ entirely). It now runs `maturin develop --release` before installing
97
+ dependencies and running pytest, at the actual repo root.
98
+ - Adapter `ImportError` messages told users to `pip install pyhound[...]`
99
+ -- `pyhound` is this project's old name and is not the installable
100
+ package; corrected to `pyvectorhound[...]` across all five adapters.
101
+ - `ModelComparison`/`Hound.compare_models()` fabricated quality scores
102
+ (`f1_score`, `ndcg`, etc.) derived from `hash(model_name)`. It now
103
+ reports only real, published cost/latency metadata unless a `quality_fn`
104
+ is supplied for real, measured quality numbers; unmeasured quality is
105
+ reported as `None` with `quality_measured: False` rather than a fake
106
+ number.
107
+ - `Hound.compare_metrics()` and `Hound.detect_drift()` returned fixed
108
+ placeholder output (zeros / `"No action needed"`) regardless of input,
109
+ with no backing data store. They now raise `NotImplementedError`
110
+ pointing at the real, tested alternative (`track_metric()` +
111
+ `get_trend_report()` / `TrendAnalyzer.detect_drift()`).
112
+ - Removed `tests/test_vector_operations.py`: it tested `VectorStore` and
113
+ `EmbeddingManager` classes that do not exist anywhere in this codebase
114
+ and are outside this package's scope (diagnosing failures in databases
115
+ you already run, not being one).
116
+ - Removed stale `README.md.bak` and `pyvectorhound/__init__.py.bak` files
117
+ left over from a previous edit.
118
+ - `pyvectorhound/diagnosis.py`'s `hunt()` report header still read
119
+ "PyHound Diagnosis Report" after the project's rename; corrected to
120
+ "PyVectorHound", with the matching test assertion updated.
121
+ - The CLI (`cli.py`) and REST server (`server.py`) never threaded
122
+ `query_embedding`/`embed_fn` through to `Hound.diagnose()`, so both would
123
+ hit the `ValueError` above unconditionally once the random-embedding
124
+ fallback was removed. Both now accept and forward a precomputed
125
+ `query_embedding`.
126
+ - `README.md` and `examples/retrieval_debug.py` described a fictional API
127
+ (`VectorHound`, `hound.validate_quality()`, `quality_score()`, DB
128
+ support for Pinecone/Elasticsearch that isn't implemented) instead of
129
+ the real `Hound`/`Diagnosis` classes. Rewritten to match the actual,
130
+ reconciled API, including `embed_fn` and lazy connection.
131
+
132
+ ## [1.3.2] - Unreleased
133
+
134
+ ### Fixed
135
+ - 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.
136
+ - `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.
137
+ - `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.
138
+ - `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.
139
+ - `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).
140
+ - `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"`.
141
+ - `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.
142
+ - `__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.
143
+
144
+ ### Added
145
+ - 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.
146
+
147
+ ### Fixed
148
+ - `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.
149
+ - `MilvusAdapter.search()` used a hardcoded `"id"` output field instead of the configurable `id_field`.
150
+ - `pyproject.toml` was still at 1.2.1 while `Cargo.toml` had already moved to 1.3.0 in a prior commit; synced both.
151
+
152
+ ### Added
153
+ - 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.
154
+ - 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.
155
+
156
+ ## [0.1.1] - 2025-01-20
157
+
158
+ ### Added
159
+ - Component-level diagnostics for retrieval pipelines
160
+ - Root cause analysis for embedding failures
161
+ - Recommendations engine with ROI estimates
162
+ - Support for Elasticsearch, Weaviate, and Pinecone
163
+ - BM25 keyword search diagnostics
164
+ - Reranker performance analysis
165
+
166
+ ### Fixed
167
+ - Memory efficiency improvements in large batch processing
168
+ - Vector similarity computation accuracy
169
+
170
+ ## [0.1.0] - 2024-12-15
171
+
172
+ ### Added
173
+ - Initial release
174
+ - Core retrieval diagnostics engine
175
+ - Embedding quality assessment
176
+ - Vector search performance profiling
177
+ - MIT license
178
+
179
+ ### Known Issues
180
+ - Streaming RAG pipelines not yet supported
181
+ - LLamaIndex integration in progress
182
+
183
+ ## [Unreleased]
184
+
185
+ ### Planned
186
+ - Streaming RAG support
187
+ - LLamaIndex integration
188
+ - Custom metric definitions
189
+ - Dashboard UI
190
+ - API server mode
191
+
192
+ For details, see [ROADMAP.md](../ROADMAP.md).
@@ -37,9 +37,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
37
37
 
38
38
  [[package]]
39
39
  name = "libc"
40
- version = "0.2.189"
40
+ version = "0.2.186"
41
41
  source = "registry+https://github.com/rust-lang/crates.io-index"
42
- checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
42
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
43
43
 
44
44
  [[package]]
45
45
  name = "matrixmultiply"
@@ -146,9 +146,9 @@ dependencies = [
146
146
 
147
147
  [[package]]
148
148
  name = "proc-macro2"
149
- version = "1.0.107"
149
+ version = "1.0.106"
150
150
  source = "registry+https://github.com/rust-lang/crates.io-index"
151
- checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
151
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
152
152
  dependencies = [
153
153
  "unicode-ident",
154
154
  ]
@@ -200,7 +200,7 @@ dependencies = [
200
200
  "proc-macro2",
201
201
  "pyo3-macros-backend",
202
202
  "quote",
203
- "syn 2.0.119",
203
+ "syn",
204
204
  ]
205
205
 
206
206
  [[package]]
@@ -213,12 +213,12 @@ dependencies = [
213
213
  "proc-macro2",
214
214
  "pyo3-build-config",
215
215
  "quote",
216
- "syn 2.0.119",
216
+ "syn",
217
217
  ]
218
218
 
219
219
  [[package]]
220
220
  name = "pyvectorhound"
221
- version = "1.3.0"
221
+ version = "1.5.0"
222
222
  dependencies = [
223
223
  "numpy",
224
224
  "pyo3",
@@ -228,9 +228,9 @@ dependencies = [
228
228
 
229
229
  [[package]]
230
230
  name = "quote"
231
- version = "1.0.47"
231
+ version = "1.0.46"
232
232
  source = "registry+https://github.com/rust-lang/crates.io-index"
233
- checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
233
+ checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
234
234
  dependencies = [
235
235
  "proc-macro2",
236
236
  ]
@@ -255,9 +255,9 @@ checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
255
255
 
256
256
  [[package]]
257
257
  name = "serde"
258
- version = "1.0.229"
258
+ version = "1.0.228"
259
259
  source = "registry+https://github.com/rust-lang/crates.io-index"
260
- checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
260
+ checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
261
261
  dependencies = [
262
262
  "serde_core",
263
263
  "serde_derive",
@@ -265,29 +265,29 @@ dependencies = [
265
265
 
266
266
  [[package]]
267
267
  name = "serde_core"
268
- version = "1.0.229"
268
+ version = "1.0.228"
269
269
  source = "registry+https://github.com/rust-lang/crates.io-index"
270
- checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
270
+ checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
271
271
  dependencies = [
272
272
  "serde_derive",
273
273
  ]
274
274
 
275
275
  [[package]]
276
276
  name = "serde_derive"
277
- version = "1.0.229"
277
+ version = "1.0.228"
278
278
  source = "registry+https://github.com/rust-lang/crates.io-index"
279
- checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
279
+ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
280
280
  dependencies = [
281
281
  "proc-macro2",
282
282
  "quote",
283
- "syn 3.0.3",
283
+ "syn",
284
284
  ]
285
285
 
286
286
  [[package]]
287
287
  name = "serde_json"
288
- version = "1.0.151"
288
+ version = "1.0.150"
289
289
  source = "registry+https://github.com/rust-lang/crates.io-index"
290
- checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
290
+ checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
291
291
  dependencies = [
292
292
  "itoa",
293
293
  "memchr",
@@ -307,17 +307,6 @@ dependencies = [
307
307
  "unicode-ident",
308
308
  ]
309
309
 
310
- [[package]]
311
- name = "syn"
312
- version = "3.0.3"
313
- source = "registry+https://github.com/rust-lang/crates.io-index"
314
- checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
315
- dependencies = [
316
- "proc-macro2",
317
- "quote",
318
- "unicode-ident",
319
- ]
320
-
321
310
  [[package]]
322
311
  name = "target-lexicon"
323
312
  version = "0.12.16"
@@ -1,11 +1,10 @@
1
1
  [package]
2
2
  name = "pyvectorhound"
3
- version = "1.3.0"
3
+ version = "1.5.0"
4
4
  edition = "2021"
5
5
  authors = ["Georgi Mammen Mullassery <mullassery@gmail.com>"]
6
6
  license = "Proprietary"
7
7
  description = "Vector search diagnostics engine for RAG/LLM systems"
8
- readme = "README.md"
9
8
 
10
9
  [dependencies]
11
10
  pyo3 = { version = "0.23", features = ["extension-module"] }