Self-hosted document library manager with BM25 keyword search and RAG chat with page-level citations
- SynthesisResult.citations changed from list[Citation] to tuple[Citation, ...] so frozen=True dataclass is genuinely immutable end-to-end - synthesize() now builds tuple via generator expression - retriever._combined: add comment explaining L2 distance inversion - retriever.hybrid_search: comment on _bm25._chunks private access - test_synthesizer_builds_context_from_chunks: drop vacuous str(call_args) fallback; assert directly on call_args.args[0] |
||
|---|---|---|
| app | ||
| config | ||
| docker/web | ||
| migrations | ||
| scripts | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| compose.override.yml.example | ||
| compose.yml | ||
| Dockerfile | ||
| environment.yml | ||
| manage.sh | ||
| pyproject.toml | ||