pyvectorhound 0.1.0__tar.gz → 1.1.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.0/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
- pyvectorhound-1.1.0/.github/ISSUE_TEMPLATE/feature_request.md +27 -0
- pyvectorhound-1.1.0/.github/dependabot.yml +35 -0
- pyvectorhound-1.1.0/.github/workflows/ci.yml +47 -0
- pyvectorhound-1.1.0/.pre-commit-config.yaml +33 -0
- pyvectorhound-1.1.0/ARCHITECTURE.md +249 -0
- pyvectorhound-1.1.0/CODE_OF_CONDUCT.md +9 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/Cargo.lock +16 -16
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/Cargo.toml +2 -2
- pyvectorhound-1.1.0/Makefile +49 -0
- pyvectorhound-1.1.0/OKF_INTEGRATION.md +450 -0
- pyvectorhound-0.1.0/README.md → pyvectorhound-1.1.0/PKG-INFO +251 -79
- pyvectorhound-0.1.0/PKG-INFO → pyvectorhound-1.1.0/README.md +189 -130
- pyvectorhound-1.1.0/ROADMAP.md +73 -0
- pyvectorhound-1.1.0/SECURITY.md +56 -0
- pyvectorhound-1.1.0/examples/retrieval_debug.py +38 -0
- pyvectorhound-1.1.0/install.sh +32 -0
- pyvectorhound-1.1.0/pyproject.toml +114 -0
- pyvectorhound-1.1.0/pyvectorhound/__init__.py +58 -0
- pyvectorhound-1.1.0/pyvectorhound/_safe_exec.py +39 -0
- pyvectorhound-1.1.0/pyvectorhound/backends.py +427 -0
- pyvectorhound-1.1.0/pyvectorhound/cli.py +314 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/pyvectorhound/database.py +6 -2
- pyvectorhound-1.1.0/pyvectorhound/error_messages.py +133 -0
- pyvectorhound-1.1.0/pyvectorhound/errors.py +77 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/pyvectorhound/hound.py +4 -4
- pyvectorhound-1.1.0/pyvectorhound/logging_config.py +81 -0
- pyvectorhound-1.1.0/pyvectorhound/okf_diagnostics.py +310 -0
- pyvectorhound-1.1.0/pyvectorhound/py.typed +0 -0
- pyvectorhound-1.1.0/pyvectorhound/server.py +241 -0
- pyvectorhound-1.1.0/pyvectorhound/validation.py +125 -0
- pyvectorhound-1.1.0/rust-toolchain.toml +3 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/src/lib.rs +7 -5
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/src/metrics.rs +20 -9
- pyvectorhound-1.1.0/tests/test_okf_diagnostics.py +288 -0
- pyvectorhound-1.1.0/tests/test_vector_operations.py +291 -0
- pyvectorhound-0.1.0/BENCHMARKS_AND_COMPARISON.md +0 -408
- pyvectorhound-0.1.0/GITHUB_OPTIMIZATION_GUIDE.md +0 -221
- pyvectorhound-0.1.0/IMPLEMENTATION_STATUS.md +0 -414
- pyvectorhound-0.1.0/INSTALL.md +0 -72
- pyvectorhound-0.1.0/ROADMAP.md +0 -212
- pyvectorhound-0.1.0/pyproject.toml +0 -84
- pyvectorhound-0.1.0/pyvectorhound/__init__.py +0 -18
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/.gitignore +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/CHANGELOG.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/CONTRIBUTING.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/LICENSE +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/ARCHITECTURE.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/GUIDE.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PYHOUND_FINAL_STATUS.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PyHound_COMPETITIVE_ROADMAP.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PyHound_FINAL_PRODUCT.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PyHound_GITHUB_LAUNCH.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PyHound_LAUNCH_CHECKLIST.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PyHound_UNIFICATION_STRATEGY.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/docs/strategy/PyHound_vs_Observability.md +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/pyvectorhound/comparison.py +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/pyvectorhound/diagnosis.py +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/pyvectorhound/scorer.py +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/tests/test_diagnosis.py +0 -0
- {pyvectorhound-0.1.0 → pyvectorhound-1.1.0}/tests/test_hound.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug Report
|
|
3
|
+
about: Report a bug to help us improve
|
|
4
|
+
title: "[BUG] "
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
Briefly describe the bug.
|
|
11
|
+
|
|
12
|
+
## Steps to Reproduce
|
|
13
|
+
1. ...
|
|
14
|
+
2. ...
|
|
15
|
+
3. ...
|
|
16
|
+
|
|
17
|
+
## Expected Behavior
|
|
18
|
+
What should happen?
|
|
19
|
+
|
|
20
|
+
## Actual Behavior
|
|
21
|
+
What actually happened?
|
|
22
|
+
|
|
23
|
+
## Environment
|
|
24
|
+
- OS: [e.g. macOS, Linux, Windows]
|
|
25
|
+
- Python version: [e.g. 3.10]
|
|
26
|
+
- Library version: [e.g. 2.0.0]
|
|
27
|
+
|
|
28
|
+
## Minimal Example
|
|
29
|
+
```python
|
|
30
|
+
# Minimal code to reproduce the bug
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Error Message
|
|
34
|
+
```
|
|
35
|
+
# Paste full error traceback here
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Additional Context
|
|
39
|
+
Any other context about the issue?
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature Request
|
|
3
|
+
about: Suggest an idea to improve the project
|
|
4
|
+
title: "[FEATURE] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Problem Statement
|
|
10
|
+
Describe the problem this feature would solve.
|
|
11
|
+
|
|
12
|
+
## Proposed Solution
|
|
13
|
+
How should this feature work?
|
|
14
|
+
|
|
15
|
+
## Use Case
|
|
16
|
+
What use case does this solve?
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
```python
|
|
20
|
+
# Example of how this would be used
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Alternatives
|
|
24
|
+
Any alternative approaches you've considered?
|
|
25
|
+
|
|
26
|
+
## Additional Context
|
|
27
|
+
Any other context or screenshots?
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# Python dependencies (pip/pyproject.toml)
|
|
4
|
+
- package-ecosystem: "pip"
|
|
5
|
+
directory: "/"
|
|
6
|
+
schedule:
|
|
7
|
+
interval: "weekly"
|
|
8
|
+
day: "monday"
|
|
9
|
+
time: "03:00"
|
|
10
|
+
open-pull-requests-limit: 5
|
|
11
|
+
reviewers:
|
|
12
|
+
- "Mullassery"
|
|
13
|
+
labels:
|
|
14
|
+
- "dependencies"
|
|
15
|
+
- "python"
|
|
16
|
+
commit-message:
|
|
17
|
+
prefix: "chore(deps):"
|
|
18
|
+
include: "scope"
|
|
19
|
+
|
|
20
|
+
# GitHub Actions
|
|
21
|
+
- package-ecosystem: "github-actions"
|
|
22
|
+
directory: "/"
|
|
23
|
+
schedule:
|
|
24
|
+
interval: "weekly"
|
|
25
|
+
day: "monday"
|
|
26
|
+
time: "03:00"
|
|
27
|
+
open-pull-requests-limit: 3
|
|
28
|
+
reviewers:
|
|
29
|
+
- "Mullassery"
|
|
30
|
+
labels:
|
|
31
|
+
- "dependencies"
|
|
32
|
+
- "ci"
|
|
33
|
+
commit-message:
|
|
34
|
+
prefix: "chore(ci):"
|
|
35
|
+
include: "scope"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Tests & Build
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
rust-build:
|
|
11
|
+
name: Rust Build & Test
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- uses: dtolnay/rust-toolchain
|
|
17
|
+
|
|
18
|
+
- uses: Swatinem/rust-cache@v2
|
|
19
|
+
|
|
20
|
+
- name: Build Rust
|
|
21
|
+
run: cargo build --release --all-features
|
|
22
|
+
|
|
23
|
+
- name: Test Rust
|
|
24
|
+
run: cargo test --release --all-features
|
|
25
|
+
|
|
26
|
+
python-tests:
|
|
27
|
+
name: Python Tests (Python ${{ matrix.python-version }})
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
strategy:
|
|
30
|
+
matrix:
|
|
31
|
+
python-version: ["3.9", "3.10", "3.11", "3.12"]
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
|
|
35
|
+
- uses: dtolnay/rust-toolchain
|
|
36
|
+
|
|
37
|
+
- uses: Swatinem/rust-cache@v2
|
|
38
|
+
|
|
39
|
+
- uses: actions/setup-python@v4
|
|
40
|
+
with:
|
|
41
|
+
python-version: ${{ matrix.python-version }}
|
|
42
|
+
|
|
43
|
+
- name: Install dependencies
|
|
44
|
+
run: pip install -e ".[dev]"
|
|
45
|
+
|
|
46
|
+
- name: Run pytest
|
|
47
|
+
run: pytest tests/ -v --tb=short
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v4.5.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-added-large-files
|
|
9
|
+
args: ['--maxkb=500']
|
|
10
|
+
|
|
11
|
+
- repo: https://github.com/rust-lang/rust-clippy
|
|
12
|
+
rev: v1.77.0
|
|
13
|
+
hooks:
|
|
14
|
+
- id: clippy
|
|
15
|
+
args: ['--all-targets', '--', '-W', 'clippy::all']
|
|
16
|
+
|
|
17
|
+
- repo: https://github.com/rust-lang/rustfmt
|
|
18
|
+
rev: v1.7.0
|
|
19
|
+
hooks:
|
|
20
|
+
- id: rustfmt
|
|
21
|
+
|
|
22
|
+
- repo: https://github.com/psf/black
|
|
23
|
+
rev: 24.1.1
|
|
24
|
+
hooks:
|
|
25
|
+
- id: black
|
|
26
|
+
language_version: python3
|
|
27
|
+
|
|
28
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
29
|
+
rev: v0.2.0
|
|
30
|
+
hooks:
|
|
31
|
+
- id: ruff
|
|
32
|
+
args: ['--fix']
|
|
33
|
+
- id: ruff-format
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# PyVectorHound Architecture & PyStreamMCP Integration
|
|
2
|
+
|
|
3
|
+
## Mission
|
|
4
|
+
|
|
5
|
+
**Debug & Optimize Retrieval**
|
|
6
|
+
|
|
7
|
+
Core Question: Why did this retrieval work (or fail)? How do we improve it?
|
|
8
|
+
|
|
9
|
+
## Core Responsibility
|
|
10
|
+
|
|
11
|
+
PyVectorHound is **exclusively responsible** for:
|
|
12
|
+
|
|
13
|
+
- **Retrieval Debugging** — Understanding why queries returned specific results
|
|
14
|
+
- **Relevance Analysis** — Scoring retrieved documents for relevance
|
|
15
|
+
- **Failure Analysis** — Root-cause analysis of retrieval failures
|
|
16
|
+
- **Replay & Forensics** — Replaying queries to debug issues
|
|
17
|
+
- **Quality Scoring** — Measuring retrieval quality
|
|
18
|
+
- **Attribution Analysis** — Tracing why a result was retrieved
|
|
19
|
+
|
|
20
|
+
## What We Do NOT Own
|
|
21
|
+
|
|
22
|
+
### ❌ Query Optimization (PyStreamMCP)
|
|
23
|
+
- Query planning
|
|
24
|
+
- Source discovery
|
|
25
|
+
- Token optimization
|
|
26
|
+
- Streaming retrieval
|
|
27
|
+
- Cost estimation
|
|
28
|
+
|
|
29
|
+
**Our role:** Debug & analyze queries that PyStreamMCP produces.
|
|
30
|
+
|
|
31
|
+
### ❌ Data Validation (StatGuardian)
|
|
32
|
+
- Schema validation
|
|
33
|
+
- Data freshness
|
|
34
|
+
- Drift detection
|
|
35
|
+
|
|
36
|
+
**Our role:** Assume data is valid, focus on why it was/wasn't retrieved.
|
|
37
|
+
|
|
38
|
+
## Critical: Use PyStreamMCP, Don't Rebuild It
|
|
39
|
+
|
|
40
|
+
**IMPORTANT:** PyVectorHound must integrate with PyStreamMCP rather than rebuilding query functionality.
|
|
41
|
+
|
|
42
|
+
### Architecture Pattern
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Query
|
|
46
|
+
↓
|
|
47
|
+
PyStreamMCP (Optimization & Execution)
|
|
48
|
+
↓
|
|
49
|
+
Retrieval Results
|
|
50
|
+
↓
|
|
51
|
+
PyVectorHound (Debug & Analyze)
|
|
52
|
+
↓
|
|
53
|
+
Root Cause Analysis & Insights
|
|
54
|
+
↓
|
|
55
|
+
Feedback Loop to PyStreamMCP
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Integration Example
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
# ✅ CORRECT: Use PyStreamMCP's query execution
|
|
62
|
+
from pystreammcp import Agent, QueryExecutor
|
|
63
|
+
from pyvectorhound import RetrievalDebugger
|
|
64
|
+
|
|
65
|
+
# Create query with PyStreamMCP
|
|
66
|
+
agent = Agent(agent_id="debug_query")
|
|
67
|
+
query_result = agent.query("customer data")
|
|
68
|
+
|
|
69
|
+
# Debug why this query returned these results
|
|
70
|
+
debugger = RetrievalDebugger(query_result)
|
|
71
|
+
analysis = debugger.analyze()
|
|
72
|
+
# - Why were these documents retrieved?
|
|
73
|
+
# - What sources were queried?
|
|
74
|
+
# - What was the token cost?
|
|
75
|
+
# - Could we have done better?
|
|
76
|
+
|
|
77
|
+
# Get root causes
|
|
78
|
+
root_causes = analysis.root_causes()
|
|
79
|
+
# - Low relevance due to source X
|
|
80
|
+
# - Token budget exceeded, missing source Y
|
|
81
|
+
# - Query optimization missed source Z
|
|
82
|
+
|
|
83
|
+
# Recommend improvements
|
|
84
|
+
improvements = analysis.recommend_improvements()
|
|
85
|
+
# - Use token_efficient strategy
|
|
86
|
+
# - Include source Z in next run
|
|
87
|
+
# - Adjust relevance threshold
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### What NOT to Do
|
|
91
|
+
|
|
92
|
+
❌ **WRONG: Don't rebuild PyStreamMCP's functionality**
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
# ❌ DO NOT DO THIS
|
|
96
|
+
class QueryOptimizer:
|
|
97
|
+
def discover_sources(self): # ← PyStreamMCP owns this
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
def optimize_for_tokens(self): # ← PyStreamMCP owns this
|
|
101
|
+
pass
|
|
102
|
+
|
|
103
|
+
def estimate_cost(self): # ← PyStreamMCP owns this
|
|
104
|
+
pass
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Instead, use PyStreamMCP's QueryExecutor:
|
|
108
|
+
```python
|
|
109
|
+
# ✅ DO THIS
|
|
110
|
+
from pystreammcp import QueryExecutor
|
|
111
|
+
|
|
112
|
+
executor = QueryExecutor()
|
|
113
|
+
result = executor.execute_query(optimized_query)
|
|
114
|
+
|
|
115
|
+
# Then debug the result
|
|
116
|
+
debugger = RetrievalDebugger(result)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Why?
|
|
120
|
+
|
|
121
|
+
PyStreamMCP already provides:
|
|
122
|
+
- ✓ Query planning & optimization
|
|
123
|
+
- ✓ Context discovery (6+ framework integrations)
|
|
124
|
+
- ✓ 7 optimization techniques
|
|
125
|
+
- ✓ Cost tracking & estimation
|
|
126
|
+
- ✓ Token efficiency (60-75% reduction)
|
|
127
|
+
- ✓ Streaming execution
|
|
128
|
+
- ✓ Multi-agent optimization
|
|
129
|
+
|
|
130
|
+
Rebuilding this in PyVectorHound would:
|
|
131
|
+
- Duplicate 1000+ lines of code
|
|
132
|
+
- Miss learned optimizations
|
|
133
|
+
- Create maintenance burden
|
|
134
|
+
- Break integration with PyStreamMCP
|
|
135
|
+
|
|
136
|
+
## Focused Responsibility
|
|
137
|
+
|
|
138
|
+
PyVectorHound excels at what it's built for:
|
|
139
|
+
|
|
140
|
+
✓ **Why did retrieval fail?**
|
|
141
|
+
- Which sources had no matches?
|
|
142
|
+
- Why were expected documents missing?
|
|
143
|
+
- Did token budget cause truncation?
|
|
144
|
+
- Was relevance threshold too high?
|
|
145
|
+
|
|
146
|
+
✓ **Can we do better?**
|
|
147
|
+
- Which optimization would help most?
|
|
148
|
+
- Should we use different sources?
|
|
149
|
+
- Can we adjust token allocation?
|
|
150
|
+
- What does the replay show?
|
|
151
|
+
|
|
152
|
+
✓ **Root Cause Analysis**
|
|
153
|
+
- 8-failure taxonomy
|
|
154
|
+
- Automatic classification
|
|
155
|
+
- Replay debugging
|
|
156
|
+
- Forensic analysis
|
|
157
|
+
|
|
158
|
+
## Integration Points
|
|
159
|
+
|
|
160
|
+
### With PyStreamMCP (Primary Integration)
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from pystreammcp import QueryExecutor, Agent
|
|
164
|
+
from pyvectorhound import RetrievalDebugger, RootCauseAnalyzer
|
|
165
|
+
|
|
166
|
+
# Execute query using PyStreamMCP
|
|
167
|
+
executor = QueryExecutor()
|
|
168
|
+
result = executor.execute_query(
|
|
169
|
+
query="customer data",
|
|
170
|
+
strategy="token_efficient"
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
# Debug the result
|
|
174
|
+
debugger = RetrievalDebugger(result)
|
|
175
|
+
analysis = debugger.analyze()
|
|
176
|
+
|
|
177
|
+
# Get root causes using PyVectorHound's forensics
|
|
178
|
+
analyzer = RootCauseAnalyzer()
|
|
179
|
+
causes = analyzer.analyze(analysis)
|
|
180
|
+
|
|
181
|
+
# Example causes:
|
|
182
|
+
# - TokenBudgetExceeded: "Missing source X due to token limit"
|
|
183
|
+
# - LowRelevanceScore: "Document below 0.5 threshold"
|
|
184
|
+
# - SourceNotQueried: "Source Y not discovered by PyStreamMCP"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### With StatGuardian
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
from statguardian import ValidationGate
|
|
191
|
+
from pyvectorhound import RetrievalDebugger
|
|
192
|
+
|
|
193
|
+
# Check if data is valid before analyzing
|
|
194
|
+
validation = ValidationGate.check(source="customer_data")
|
|
195
|
+
|
|
196
|
+
if validation.is_valid():
|
|
197
|
+
# Safe to debug
|
|
198
|
+
debugger = RetrievalDebugger(result)
|
|
199
|
+
else:
|
|
200
|
+
# Data quality issue, not a retrieval issue
|
|
201
|
+
print(f"Data quality issue: {validation.error}")
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Module Structure
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
src/
|
|
208
|
+
├── debugger.rs # Core retrieval debugging
|
|
209
|
+
├── analyzer.rs # Root cause analysis
|
|
210
|
+
├── failure_taxonomy.rs # 8 failure types
|
|
211
|
+
├── replay.rs # Query replay for debugging
|
|
212
|
+
├── forensics/ # Forensic analysis
|
|
213
|
+
│ ├── source_analysis.rs
|
|
214
|
+
│ ├── relevance_analysis.rs
|
|
215
|
+
│ └── token_analysis.rs
|
|
216
|
+
└── storage/ # Debug data persistence
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Philosophy
|
|
220
|
+
|
|
221
|
+
PyVectorHound is to retrieval debugging what a debugger is to code execution.
|
|
222
|
+
|
|
223
|
+
- A code debugger doesn't write programs, it debugs them
|
|
224
|
+
- A database profiler doesn't optimize queries, it analyzes them
|
|
225
|
+
- PyVectorHound doesn't optimize retrieval, it debugs it
|
|
226
|
+
|
|
227
|
+
PyStreamMCP handles optimization. PyVectorHound explains why it worked or didn't.
|
|
228
|
+
|
|
229
|
+
## Outcome
|
|
230
|
+
|
|
231
|
+
When properly integrated:
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
Query Submitted
|
|
235
|
+
↓
|
|
236
|
+
PyStreamMCP executes with optimizations
|
|
237
|
+
↓
|
|
238
|
+
Results Retrieved
|
|
239
|
+
↓
|
|
240
|
+
PyVectorHound analyzes the result
|
|
241
|
+
↓
|
|
242
|
+
Root cause identified
|
|
243
|
+
↓
|
|
244
|
+
Feedback to PyStreamMCP for next run
|
|
245
|
+
↓
|
|
246
|
+
Continuous Improvement
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
PyStreamMCP optimizes. PyVectorHound debugs. Together they form a complete retrieval intelligence system.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
This project adopts the [Contributor Covenant](https://www.contributor-covenant.org/version/2/1/code_of_conduct/),
|
|
4
|
+
version 2.1.
|
|
5
|
+
|
|
6
|
+
In short: be respectful and constructive. Harassment and discrimination are not tolerated.
|
|
7
|
+
|
|
8
|
+
To report unacceptable behavior, contact the maintainer at mullassery@gmail.com. Reports will
|
|
9
|
+
be handled confidentially.
|
|
@@ -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 = 3
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "autocfg"
|
|
@@ -43,9 +43,9 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
|
|
43
43
|
|
|
44
44
|
[[package]]
|
|
45
45
|
name = "matrixmultiply"
|
|
46
|
-
version = "0.3.
|
|
46
|
+
version = "0.3.11"
|
|
47
47
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
48
|
-
checksum = "
|
|
48
|
+
checksum = "3f607c237553f086e7043417a51df26b2eb899d3caff94e6a67592ff992fedc7"
|
|
49
49
|
dependencies = [
|
|
50
50
|
"autocfg",
|
|
51
51
|
"rawpointer",
|
|
@@ -53,9 +53,9 @@ dependencies = [
|
|
|
53
53
|
|
|
54
54
|
[[package]]
|
|
55
55
|
name = "memchr"
|
|
56
|
-
version = "2.8.
|
|
56
|
+
version = "2.8.3"
|
|
57
57
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
58
|
-
checksum = "
|
|
58
|
+
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
|
59
59
|
|
|
60
60
|
[[package]]
|
|
61
61
|
name = "memoffset"
|
|
@@ -131,9 +131,9 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
|
131
131
|
|
|
132
132
|
[[package]]
|
|
133
133
|
name = "portable-atomic"
|
|
134
|
-
version = "1.
|
|
134
|
+
version = "1.14.0"
|
|
135
135
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
136
|
-
checksum = "
|
|
136
|
+
checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3"
|
|
137
137
|
|
|
138
138
|
[[package]]
|
|
139
139
|
name = "portable-atomic-util"
|
|
@@ -218,7 +218,7 @@ dependencies = [
|
|
|
218
218
|
|
|
219
219
|
[[package]]
|
|
220
220
|
name = "pyvectorhound"
|
|
221
|
-
version = "
|
|
221
|
+
version = "1.0.0"
|
|
222
222
|
dependencies = [
|
|
223
223
|
"numpy",
|
|
224
224
|
"pyo3",
|
|
@@ -243,15 +243,15 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
|
|
|
243
243
|
|
|
244
244
|
[[package]]
|
|
245
245
|
name = "rustc-hash"
|
|
246
|
-
version = "2.1.
|
|
246
|
+
version = "2.1.3"
|
|
247
247
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
248
|
-
checksum = "
|
|
248
|
+
checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
|
|
249
249
|
|
|
250
250
|
[[package]]
|
|
251
251
|
name = "rustversion"
|
|
252
|
-
version = "1.0.
|
|
252
|
+
version = "1.0.23"
|
|
253
253
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
254
|
-
checksum = "
|
|
254
|
+
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
|
255
255
|
|
|
256
256
|
[[package]]
|
|
257
257
|
name = "serde"
|
|
@@ -298,9 +298,9 @@ dependencies = [
|
|
|
298
298
|
|
|
299
299
|
[[package]]
|
|
300
300
|
name = "syn"
|
|
301
|
-
version = "2.0.
|
|
301
|
+
version = "2.0.119"
|
|
302
302
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
303
|
-
checksum = "
|
|
303
|
+
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
|
304
304
|
dependencies = [
|
|
305
305
|
"proc-macro2",
|
|
306
306
|
"quote",
|
|
@@ -327,6 +327,6 @@ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
|
327
327
|
|
|
328
328
|
[[package]]
|
|
329
329
|
name = "zmij"
|
|
330
|
-
version = "1.0.
|
|
330
|
+
version = "1.0.23"
|
|
331
331
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
332
|
-
checksum = "
|
|
332
|
+
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "pyvectorhound"
|
|
3
|
-
version = "
|
|
3
|
+
version = "1.0.0"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
authors = ["Georgi Mammen Mullassery <mullassery@gmail.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -14,5 +14,5 @@ serde = { version = "1.0", features = ["derive"] }
|
|
|
14
14
|
serde_json = "1.0"
|
|
15
15
|
|
|
16
16
|
[lib]
|
|
17
|
-
name = "
|
|
17
|
+
name = "_core"
|
|
18
18
|
crate-type = ["cdylib"]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
.PHONY: install install-dev build test lint fmt clean help setup-hooks
|
|
2
|
+
|
|
3
|
+
help:
|
|
4
|
+
@echo "pyvectorhound development tasks:"
|
|
5
|
+
@echo " make install Install pre-commit hooks"
|
|
6
|
+
@echo " make build Build release wheel"
|
|
7
|
+
@echo " make test Run all tests"
|
|
8
|
+
@echo " make test-cov Run tests with coverage"
|
|
9
|
+
@echo " make lint Run linters (clippy, black, ruff, mypy)"
|
|
10
|
+
@echo " make fmt Format code"
|
|
11
|
+
@echo " make fmt-check Check format without changing"
|
|
12
|
+
@echo " make clean Remove build artifacts"
|
|
13
|
+
|
|
14
|
+
install: setup-hooks
|
|
15
|
+
@echo "✓ Development environment ready"
|
|
16
|
+
|
|
17
|
+
setup-hooks:
|
|
18
|
+
@command -v pre-commit >/dev/null 2>&1 || pip install pre-commit
|
|
19
|
+
pre-commit install
|
|
20
|
+
|
|
21
|
+
build:
|
|
22
|
+
maturin build --release
|
|
23
|
+
|
|
24
|
+
test:
|
|
25
|
+
pytest -v
|
|
26
|
+
|
|
27
|
+
test-cov:
|
|
28
|
+
pytest -v --cov=pyvectorhound --cov-report=term-missing
|
|
29
|
+
|
|
30
|
+
lint:
|
|
31
|
+
cargo clippy --all-targets
|
|
32
|
+
black --check .
|
|
33
|
+
ruff check .
|
|
34
|
+
mypy pyvectorhound
|
|
35
|
+
|
|
36
|
+
fmt:
|
|
37
|
+
cargo fmt --all
|
|
38
|
+
black .
|
|
39
|
+
ruff check . --fix
|
|
40
|
+
|
|
41
|
+
fmt-check:
|
|
42
|
+
cargo fmt --all -- --check
|
|
43
|
+
black --check .
|
|
44
|
+
|
|
45
|
+
clean:
|
|
46
|
+
cargo clean
|
|
47
|
+
find . -type d -name __pycache__ -exec rm -rf {} +
|
|
48
|
+
find . -type f -name "*.pyc" -delete
|
|
49
|
+
rm -rf build dist *.egg-info .pytest_cache .mypy_cache
|