feat: Implement CodexLens multi-provider embedding rotation management

- Added functions to get and update CodexLens embedding rotation configuration.
- Introduced functionality to retrieve enabled embedding providers for rotation.
- Created endpoints for managing rotation configuration via API.
- Enhanced dashboard UI to support multi-provider rotation configuration.
- Updated internationalization strings for new rotation features.
- Adjusted CLI commands and embedding manager to support increased concurrency limits.
- Modified hybrid search weights for improved ranking behavior.
This commit is contained in:
catlog22
2025-12-25 14:13:27 +08:00
parent dfa8b541b4
commit 8e744597d1
12 changed files with 713 additions and 20 deletions

View File

@@ -45,9 +45,9 @@ class TestHybridSearchBasics:
"""Test HybridSearchEngine initializes with default weights."""
engine = HybridSearchEngine()
assert engine.weights == HybridSearchEngine.DEFAULT_WEIGHTS
assert engine.weights["exact"] == 0.4
assert engine.weights["fuzzy"] == 0.3
assert engine.weights["vector"] == 0.3
assert engine.weights["exact"] == 0.3
assert engine.weights["fuzzy"] == 0.1
assert engine.weights["vector"] == 0.6
def test_engine_custom_weights(self):
"""Test HybridSearchEngine accepts custom weights."""

View File

@@ -230,16 +230,16 @@ class TestRRFSyntheticRankings:
vector = [SearchResult(path="c.py", score=8.0, excerpt="...")]
results_map = {"exact": exact, "fuzzy": fuzzy, "vector": vector}
weights = {"exact": 0.4, "fuzzy": 0.3, "vector": 0.3}
weights = {"exact": 0.3, "fuzzy": 0.1, "vector": 0.6}
fused = reciprocal_rank_fusion(results_map, weights=weights)
assert len(fused) == 3
# Each appears in one source only, so scores differ by weights
# a.py: 0.4/61 ≈ 0.0066
# b.py: 0.3/61 ≈ 0.0049
# c.py: 0.3/61 ≈ 0.0049
assert fused[0].path == "a.py", "Exact (higher weight) should rank first"
# c.py: 0.6/61 ≈ 0.0098 (vector, highest weight)
# a.py: 0.3/61 ≈ 0.0049 (exact)
# b.py: 0.1/61 ≈ 0.0016 (fuzzy)
assert fused[0].path == "c.py", "Vector (higher weight) should rank first"
class TestNormalizeBM25Score: