High-performance document processing pipeline that transforms GitHub repositories containing markdown, PDFs, and 150+ text file types into searchable vector databases for AI applications. Now with multi-repository batch processing, multiple embedding providers, and state-of-the-art deduplication algorithms.
This project automatically processes GitHub repositories containing documentation (markdown, PDFs, code, and text files) and creates optimized vector embeddings for Retrieval-Augmented Generation (RAG), semantic search, and AI chat applications. It supports multiple embedding providers including cloud-based APIs and local models, featuring cutting-edge deduplication algorithms and intelligent PDF extraction.
- 🔄 Multi-Repository Processing: Process multiple repos sequentially with one command
- 🤖 Multi-Provider Support: Azure OpenAI, Mistral AI & Sentence Transformers
- 📑 PDF Processing: PyMuPDF (60x faster), PyPDFLoader, and Mistral OCR API
- ⚡ 5-15x Faster Processing: Vectorized duplicate detection algorithms
- 🎯 Smart Deduplication: Two-stage content hash + semantic similarity
- 📊 Real-time Progress: Detailed processing reports with summary statistics
- 🛡️ Production Ready: Error handling, rate limiting, retry logic
- 🎛️ Highly Configurable: YAML configs with environment variable support
- 📚 150+ File Types: Process code, docs, configs, PDFs, and more
- 📄 Individual File Processing: Maintain document boundaries for better search (v0.3.3)
- 🔒 Deterministic IDs: Consistent vector IDs across runs prevent duplicates (v0.3.3)
- 💾 Embedding Cache: LRU cache reduces API calls by 20-30% (v0.3.2)
- 🎨 Semantic Chunking: Context-aware text splitting for better retrieval (v0.3.1)
- 📈 Quality Scoring: Rank chunks by information density and relevance (v0.3.2)
- 🔧 Configurable Payloads: Choose content fields for compatibility (v0.3.2)
- 🧩 Hybrid Retrieval: Optional dense + sparse BM25 search with Qdrant Query API (v0.5)
- 🗜️ TurboQuant Ready: Optional Qdrant 1.18+ TurboQuant collection setup (v0.5)
- AI Chatbots - Create knowledge bases from documentation
- Semantic Search - Enable intelligent document discovery
- RAG Applications - Augment LLMs with domain-specific knowledge
- Technical Documentation - Process markdown, PDFs, and code with specialized embeddings
- Content Processing - Handles 150+ file types including PDFs, HTML, TXT, code files
git clone <your-repo-url>
cd github-qdrant-sync
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txtSet up your API keys for your chosen embedding provider (see Configuration Guide below)
Copy the example config and add your API keys:
cp config.yaml.example config.yaml
# Edit config.yaml with your settings
# Set API keys in .env file for security
cp .env.example .env
# Edit .env with your API keyspython github_to_qdrant.py config.yaml- Python 3.10+
- 4GB+ RAM (for large repositories)
- Internet connection (for API calls)
pip install -r requirements.txtCore Dependencies:
langchain- Document processingqdrant-client>=1.18.0- Vector database client with TurboQuant supportopenai- Azure OpenAI embeddingsnumpy- Vectorized operationsmistralai- Mistral AI embeddingssentence-transformers- Local embedding models (optional)
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# or
venv\Scripts\activate # Windows
pip install -r requirements.txtThe project uses YAML configuration files with environment variable support. Start with config.yaml.example:
# Embedding provider selection
embedding_provider: azure_openai # or mistral_ai, sentence_transformers
github:
repository_url: https://github.com/your-org/your-repo.git
branch: main
token: ${GITHUB_TOKEN} # For private repos (from .env file)
qdrant:
url: ${QDRANT_URL} # e.g., https://your-cluster.qdrant.io
api_key: ${QDRANT_API_KEY}
collection_name: your-collection
vector_size: 3072 # Must match embedding model
upload_batch_size: 64embedding_provider: azure_openai
azure_openai:
api_key: ${AZURE_OPENAI_API_KEY}
endpoint: ${AZURE_OPENAI_ENDPOINT}
deployment_name: text-embedding-3-large
api_version: "2024-02-01"
qdrant:
vector_size: 3072 # for text-embedding-3-largeembedding_provider: mistral_ai
mistral_ai:
api_key: ${MISTRAL_API_KEY}
model: codestral-embed # or mistral-embed
output_dimension: 3072
qdrant:
vector_size: 3072embedding_provider: sentence_transformers
sentence_transformers:
model: intfloat/multilingual-e5-large
vector_size: 1024
qdrant:
vector_size: 1024
vector_name: intfloat/multilingual-e5-large # Optional: for MCP compatibilitySentence Transformers Benefits:
- ✅ No API Keys Required - Runs locally
- ✅ No Rate Limits - Process any amount of data
- ✅ Privacy - Data never leaves your machine
- ✅ Cost Effective - No per-token charges
- ✅ Offline Capable - Works without internet
processing:
chunk_size: 1000 # Characters per chunk
chunk_overlap: 200 # Overlap for context
chunking_strategy: semantic # 'semantic' or 'recursive' (v0.3.1+)
embedding_batch_size: 50 # Optimized batch size
batch_delay_seconds: 1 # Required for Azure OpenAI
deduplication_enabled: true # Enable smart deduplication
similarity_threshold: 0.95 # Duplicate detection threshold
file_mode: all_text # Process all text files (or markdown_only)
# New in v0.3.2: Configurable payload fields
payload:
metadata_structure: nested # nested or flat
content_fields:
- content # For n8n compatibility
- page_content # For LangChain
- document # For MCP compatibility
- text # Alternative field name
preview_length: 200 # Preview snippet length
minimal_mode: false # Reduce payload size by 50%TurboQuant is opt-in and requires Qdrant server or Cloud 1.18+ plus qdrant-client>=1.18.0. Start with bits4 on a test collection before enabling it for production data. Sparse BM25 vectors use Qdrant Document inference; set qdrant.cloud_inference: true for Qdrant Cloud/server inference or install qdrant-client[fastembed] for local inference.
qdrant:
vector_name: dense # Required when sparse_vector.enabled is true
cloud_inference: false
quantization:
enabled: false
method: turbo
bits: bits4 # bits4, bits2, bits1_5, or bits1
always_ram: true
apply_to_existing_collections: false
sparse_vector:
enabled: false
name: sparse
model: qdrant/bm25Other recent Qdrant features are mainly operational wins for this project: 1.18 adds memory monitoring, per-collection metrics, strict-mode guardrails, audit-log querying, and in-place named-vector schema changes; 1.17 improves write-load search latency and observability; 1.16 improves filtered search and disk-efficient storage. Hybrid retrieval and TurboQuant are the pieces wired into this repo because they directly affect ingestion and RAG quality.
# Process with default config
python github_to_qdrant.py config.yaml
# Process different repository
python github_to_qdrant.py config.yaml --repo-url https://github.com/other/repo.gitProcess multiple repositories sequentially with a single command:
# Process multiple repositories from a list file
python github_to_qdrant.py config.yaml --repo-list repositories.yamlRepository List File Format (repositories.yaml):
repositories:
# Basic repository
- url: https://github.com/langchain-ai/langchain.git
collection_name: langchain-docs
# Repository with specific branch
- url: https://github.com/openai/openai-python.git
branch: main
collection_name: openai-python-docs
# Private repository using SSH
- url: git@github.com:myorg/private-repo.git
branch: develop
collection_name: private-docs
# Multiple versions of the same project
- url: https://github.com/facebook/react.git
branch: main
collection_name: react-latest
- url: https://github.com/facebook/react.git
branch: 18.x
collection_name: react-v18Features:
- ✅ Sequential processing with progress tracking
- ✅ Individual collection names per repository
- ✅ Continues processing if one repository fails
- ✅ Comprehensive summary report at the end
- ✅ All global settings from
config.yamlapply
Example Output:
============================================================
Processing repository 2/5
Repository: https://github.com/openai/openai-python.git
Branch: main
Collection: openai-python-docs
============================================================
[... processing output ...]
============================================================
MULTI-REPOSITORY PROCESSING SUMMARY
============================================================
Total repositories: 5
✅ Successful: 4
❌ Failed: 1
Details:
------------------------------------------------------------
✅ langchain → langchain-docs
Files: 234, Chunks: 1,234
Time: 45.2s
✅ openai-python → openai-python-docs
Files: 89, Chunks: 567
Time: 23.1s
❌ private-repo → Failed
Error: Authentication error
✅ react → react-latest
Files: 456, Chunks: 2,345
Time: 89.3s
✅ react → react-v18
Files: 423, Chunks: 2,123
Time: 82.7s
------------------------------------------------------------
Totals:
Files processed: 1,202
Chunks created: 6,269
Processing time: 240.3s (4m 0s)
Embedding Cache Performance:
💾 Total hits: 1,543
💾 Total misses: 4,726
💾 Hit rate: 24.6%
💾 Cache size: 500/500
============================================================
Query your vector database using the included retrieval CLI:
Basic Query:
python rag_retrieval.py config.yaml --query "How do I configure authentication?"With Filters:
# In config.yaml:
retrieval:
mode: dense
top_k: 10
fetch_k: 40 # Retrieves more candidates for grouping
max_chunks_per_file: 3 # Caps results per file
filters:
repository: my-repo-name # Optional filteringHybrid Dense + Sparse Retrieval (Qdrant 1.18+):
qdrant:
vector_name: dense
cloud_inference: true # Or install qdrant-client[fastembed] for local sparse inference
sparse_vector:
enabled: true
name: sparse
model: qdrant/bm25
retrieval:
mode: hybrid
fusion: rrf
top_k: 10
fetch_k: 40Hybrid mode stores a named dense vector and a sparse BM25 vector per chunk, then uses Qdrant Query API prefetches with reciprocal-rank fusion. Existing unnamed-vector collections should be recreated or migrated intentionally before enabling hybrid mode.
JSON Output (for programmatic use):
python rag_retrieval.py config.yaml --query "setup guide" --format jsonVerbose Logging:
python rag_retrieval.py config.yaml --query "api reference" --verboseFeatures:
- ✅ Smart Grouping: Caps results per file for better context diversity
- ✅ Parent Window Expansion: Retrieve surrounding context around matched chunks
- ✅ Multiple Output Formats: Human-readable text or machine-readable JSON
- ✅ Flexible Filtering: Filter by repository, file type, or any metadata field
- ✅ Marker Exclusion: Internal incremental-sync markers are hidden by default
- ✅ Hybrid Search: Optional dense+sparse retrieval for better keyword recall
- ✅ Timing Information: Debug mode shows embedding, search, and grouping times
- ✅ Robust Error Handling: Clear error messages and suggestions
Parent Window Context:
# Retrieve surrounding chunks for expanded context
python rag_retrieval.py config.yaml --query "installation" --with-parent-windowExample Output:
INFO: Querying collection: my-docs
INFO: Query: How do I configure authentication?
INFO: Returning 10 results
#1 score=0.8234 file=docs/authentication.md
preview: Configure authentication using OAuth2 or API keys...
#2 score=0.7891 file=guides/setup.md
preview: Authentication setup requires the following steps...
#3 score=0.7654 file=api/reference.md
preview: API authentication methods include bearer tokens...
Configuration Options:
retrieval:
mode: dense # dense or hybrid
fusion: rrf # hybrid only: rrf or dbsf
top_k: 10 # Final number of results to return
fetch_k: 40 # Candidates to fetch before grouping (should be 3-4x top_k)
max_chunks_per_file: 3 # Maximum results per file
parent_window: 2 # Chunks before/after for context expansion
filters: # Optional metadata filters
repository: my-repo
source_type: markdownCLI Arguments:
--query: Your search query (required)--limit: Override config's top_k--format: Output format (text or json)--with-parent-window: Enable context expansion--verbose/-v: Enable debug logging--quiet/-q: Suppress info messages
Use Cases:
- 🤖 AI Chatbots: Retrieve relevant context for LLM responses
- 🔍 Semantic Search: Find similar content across documentation
- 📚 Documentation Q&A: Answer questions from your knowledge base
- 🧪 Testing Retrieval Quality: Evaluate embedding and chunking strategies
# Different repository configurations
python github_to_qdrant.py config_technical.yaml
# Multi-language documentation
python github_to_qdrant.py config_multilang.yaml
# Large documentation projects
python github_to_qdrant.py config_enterprise.yamlThe pipeline includes state-of-the-art PDF processing with three modes:
1. Local Mode (Offline, Fast)
pdf_processing:
enabled: true
mode: local # Uses PyMuPDF (60x faster) with PyPDFLoader fallback2. Cloud Mode (Mistral OCR API)
pdf_processing:
enabled: true
mode: cloud # Best quality, handles scanned PDFs, $0.001/page
cloud:
max_pages_per_doc: 100 # Cost control3. Hybrid Mode (Smart Selection)
pdf_processing:
enabled: true
mode: hybrid # Local first, cloud for complex/scanned PDFs
hybrid:
force_cloud_patterns: # Always use OCR for these
- "*scan*.pdf"
- "*ocr*.pdf"Process specific branch:
github:
repository_url: https://github.com/your-org/your-repo.git
branch: developSwitch to Mistral AI:
embedding_provider: mistral_ai
mistral_ai:
api_key: ${MISTRAL_API_KEY}
model: codestral-embed
output_dimension: 3072Use Local Models:
embedding_provider: sentence_transformers
sentence_transformers:
model: intfloat/multilingual-e5-large
vector_size: 1024| Provider | Model | Dimensions | Best For | Context |
|---|---|---|---|---|
| Azure OpenAI | text-embedding-ada-002 | 1536 | General text | 2,048 tokens |
| Azure OpenAI | text-embedding-3-small | 1536 | Efficient processing | 8,191 tokens |
| Azure OpenAI | text-embedding-3-large | 3072 | Best quality | 8,191 tokens |
| Mistral AI | mistral-embed | 1024 | General text | 8,000 tokens |
| Mistral AI | codestral-embed | 3072 | Technical docs | 8,000 tokens |
| Sentence Transformers | all-MiniLM-L6-v2 | 384 | Lightweight/Fast | 256 tokens |
| Sentence Transformers | multilingual-e5-large | 1024 | Multilingual | 512 tokens |
- Technical Documentation: Use
codestral-embed(Mistral AI) - General Documentation: Use
text-embedding-3-large(Azure OpenAI) - Cost-Effective: Use
text-embedding-3-small(Azure OpenAI) - Code Repositories: Use
codestral-embed(Mistral AI) - Privacy/Offline: Use
multilingual-e5-large(Sentence Transformers) - Fast/Lightweight: Use
all-MiniLM-L6-v2(Sentence Transformers) - Multilingual Content: Use
multilingual-e5-large(Sentence Transformers) - No API Costs: Use any Sentence Transformers model
This project features cutting-edge deduplication that's 5-15x faster than traditional methods:
- O(n²) complexity: Each chunk compared to ALL previous chunks
- Individual similarity calculations
- No progress reporting
- Hours for large repositories
- ✅ Content hash pre-filtering: Instant exact duplicate removal
- ✅ Vectorized similarity: Batch NumPy operations
- ✅ Progress reporting: Real-time feedback
- ✅ Memory optimization: Batched processing
- ✅ Smart thresholding: Configurable similarity detection
| Repository Size | Traditional | Optimized | Speedup |
|---|---|---|---|
| Small (100 files) | 5 minutes | 1 minute | 5x |
| Medium (500 files) | 45 minutes | 5 minutes | 9x |
| Large (1000+ files) | 3+ hours | 15 minutes | 12x+ |
Azure OpenAI:
- Batch size: 50 chunks
- Delay: 1 second between batches
- Auto-retry with exponential backoff
Mistral AI:
- Batch size: 50 chunks
- Delay: 1 second between batches
- Shorter retry delays
Sentence Transformers:
- No rate limits (local processing)
- Batch size: 50 chunks (for memory management)
- Processing speed depends on hardware (CPU/GPU)
- Batched processing: Prevents memory overflow
- Streaming embeddings: Process chunks incrementally
- Automatic cleanup: Temporary files removed
Local Models (Sentence Transformers):
- Model loaded once, reused for all chunks
- Additional VRAM usage for GPU acceleration
- Faster processing with dedicated GPU
This project uses a configurable payload structure for maximum compatibility with n8n, LangChain, MCP, and other frameworks. Each document chunk is stored with the following structure:
For large collections, enabling payload indexes improves performance for filtered queries (e.g. “only PDFs”, “only a specific repository”, “only a specific file path”).
- Nested metadata (
payload.metadata_structure: nested): index fields use paths likemetadata.repository. - Flat metadata (
payload.metadata_structure: flat): index fields use paths likerepository.
Configure in qdrant.payload_indexes in config.yaml (see config.yaml.example).
When processing.track_file_changes: true, the pipeline computes a SHA-256 file_hash per file and uses deterministic identifiers to safely support either:
- One repo per collection, or
- Multiple repos/branches sharing a collection.
Key metadata fields:
repo_id: SHA-256 ofrepo_url@branchfile_id: SHA-256 ofrepo_id:file_pathfile_upload_id: SHA-256 offile_id:file_hash
This prevents accidental cross-repo deletes when different repos contain the same file_path, and it enables auto-repair of partial uploads by writing a per-file marker only after upload succeeds.
{
// Configurable content fields (choose which to include via config)
"content": "Full document text content here...", // n8n
"page_content": "Full document text content here...", // LangChain
"document": "Full document text content here...", // MCP
"text": "Full document text content here...", // Alternative
// Flattened metadata (v0.3.2) - no nesting for better performance
"doc_id": "repo-name_file.md_123",
"chunk_id": 123,
"source": "path/to/file.md",
"source_type": "markdown", // pdf, code, config, etc.
"repository": "your-repo-name",
"branch": "main",
"preview": "First 200 characters of content...",
"chunk_size": 850,
"token_count": 213, // NEW in v0.3.2
"quality_score": 0.87, // NEW in v0.3.2 (0-1 scale)
"timestamp": 1705147200, // Unix timestamp (smaller)
"content_hash": "abc123de",
"extraction_method": "default",
// PDF-specific fields (when applicable)
"page_number": 5,
"total_pages": 42
}Content Fields (configurable via payload.content_fields):
content- Full text for n8n compatibilitypage_content- Full text for LangChain compatibilitydocument- Full text for MCP server compatibilitytext- Alternative field name some systems use
Metadata Fields (flattened in v0.3.2):
doc_id- Unique document identifier (repo_file_chunk)chunk_id- Sequential chunk numbersource- Path to source filesource_type- File type (pdf, markdown, code, config, etc.)preview- Configurable preview snippet (default 200 chars)token_count- Token count for LLM context management (v0.3.2)quality_score- Content quality score 0-1 (v0.3.2)timestamp- Unix timestamp (more compact than ISO)content_hash- MD5 hash for duplicate detectionextraction_method- How content was extracted
- 🔧 Standard Compatible - Works seamlessly with LangChain, n8n, and most Qdrant clients
- 🤖 MCP Server Ready - Includes
documentfield for Qdrant MCP server compatibility - 💾 Efficient Storage - Clean separation between standard and compatibility fields
- 🔍 Easy Filtering - Structured metadata enables precise search and filtering
- 📊 Debug Friendly - Preview field allows quick content inspection without full retrieval
github-qdrant-sync/
├── github_to_qdrant.py # 🌟 Main processing script
├── pdf_processor.py # 📑 Advanced PDF processing module
├── config.yaml.example # 📝 Configuration template with docs
├── config.yaml # 🔧 Your configuration (gitignored)
├── repositories.yaml.example # 📋 Multi-repo list template
├── repositories.yaml # 📋 Your repository list (gitignored)
├── .env.example # 🔐 Environment variables template
├── .env # 🔑 Your API keys (gitignored)
├── requirements.txt # 📦 Python dependencies
├── .gitignore # 🚫 Git exclusions
├── README.md # 📖 This documentation
├── CLAUDE.md # 🤖 AI assistant context (gitignored)
├── venv/ # 🐍 Virtual environment (gitignored)
└── markdown/ # 📄 Generated markdown output (gitignored)
├── repo-name/
│ ├── __combined_markdown.md
│ ├── folder1.md
│ └── folder2.md
└── ...
config.yaml.example- Template with inline documentation and examplesconfig.yaml- Your custom configuration (gitignored)repositories.yaml.example- Template for multi-repository processingrepositories.yaml- Your repository list (gitignored).env.example- Template for environment variables.env- Your API keys and sensitive data (gitignored)
✅ Cleaner syntax - More readable than JSON
✅ Comments support - Inline documentation
✅ Environment variables - Secure API key management via ${VAR_NAME} syntax
✅ Multi-line strings - Better for long text values
✅ Default values - Support for ${VAR:-default} pattern
# Reinstall requirements to ensure all dependencies are available
pip install -r requirements.txt- Check API keys in config file
- Verify endpoint URLs
- Ensure API keys have proper permissions
- Increase
batch_delay_secondsin config - Reduce
embedding_batch_size - Check API quotas
- Reduce
chunk_sizein config - Increase
batch_delay_seconds - Process smaller repositories
- Check internet connection
- Verify Qdrant URL and API key
- Test with smaller batch size
Enable detailed logging:
logging:
level: DEBUG
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"- Check the logs - Enable DEBUG logging
- Verify configuration - Use
config.yaml.example - Test connections - Run with minimal config
- Check dependencies - Reinstall requirements
- API quotas - Verify account limits
❌ Never commit API keys to Git!
✅ Safe practices:
# Use .env file (recommended)
cp .env.example .env
# Edit .env with your API keys:
# AZURE_OPENAI_API_KEY=your-key
# MISTRAL_API_KEY=your-key
# QDRANT_API_KEY=your-key
# GITHUB_TOKEN=your-token
# Then use environment variables in config.yaml:
# api_key: ${AZURE_OPENAI_API_KEY}
# Or use separate config files (gitignored)
cp config.yaml.example config.local.yaml
# Edit config.local.yaml with real keys
python github_to_qdrant.py config.local.yaml- Use environment variables for secrets
- Enable rate limiting
- Monitor API usage and costs
- Set up proper logging
- Use dedicated service accounts
# 1. Configure for technical content in config.yaml
embedding_provider: mistral_ai
mistral_ai:
model: codestral-embed
output_dimension: 3072
# 2. Process repository
python github_to_qdrant.py config.yaml# Process different language versions
python github_to_qdrant.py config_english.yaml # English docs
python github_to_qdrant.py config_german.yaml # German docs
python github_to_qdrant.py config_french.yaml # French docs
# Or use multi-repo processing with single config
python github_to_qdrant.py config.yaml --repo-list multilang_repos.yaml#!/bin/bash
# Update vector database when docs change
git pull origin main
python github_to_qdrant.py config.yaml
echo "Vector database updated successfully"Large Documentation Repository (1,200+ files):
- Processing time: 12 minutes (vs 3+ hours traditional)
- Duplicates removed: 1,847 chunks (23% of total)
- Final chunks: 6,234 unique vectors
- Accuracy: 99.8% (manual validation)
Performance breakdown:
- Repository cloning: 30 seconds
- Markdown processing: 2 minutes
- Embedding generation: 6 minutes
- Deduplication: 3 minutes
- Upload to Qdrant: 1 minute
- ✨ TurboQuant Support: Optional Qdrant 1.18+ TurboQuant collection config
- ✨ Hybrid Retrieval: Optional dense + sparse BM25 ingestion and RRF querying
- 🔧 Shared Qdrant Config: Ingestion and retrieval now share connection parsing
- 🐛 Metadata Config Fix:
payload.metadata_structureis canonical, with legacy fallback - 🐛 Exclude Pattern Fixes: Glob-aware excludes for paths like
*.pyc - 🧪 Unit Tests: Added pytest coverage for config, payloads, Qdrant setup, and retrieval
- 🐛 Retrieval Fixes: Fixed
fetch_kdefaults, collection existence checks, empty result guidance, and debug logging - ✨ CLI Polish: Added JSON output, verbose/quiet logging, timing details, and clearer help text
- 🔧 Pipeline Reliability: Added orphaned marker cleanup, config validation, and payload index mismatch warnings
- 📚 Documentation: Expanded retrieval docs and updated example configs
- ✨ Retrieval CLI: Added
rag_retrieval.pyfor querying Qdrant collections - ✨ Grouping by File: Optionally cap/interleave results per file for better context diversity
- ✨ Token-aware Chunking: Optional
token_recursivechunking strategy usingtiktoken - ✨ Qdrant Payload Indexes: Optional payload index management for faster filtered queries
- 🔁 Robust Incremental Sync: Dedup-safe skipping via per-file markers written after successful upload
- 🛡️ Shared Collection Safety: Multi-repo/branch safe scoping with
repo_id/file_id/file_upload_id - 🐛 Track File Changes Fixes: Safer deletes + legacy fallback handling for older collections
- ✨ Standardized embedding config: Use
modelconsistently across providers - 🐛 Metadata field fixes: Improved repository/name mapping and attribution fields
- 📌 Embedding tracking: Persist
embedding_providerandembedding_modelin metadata
- ✨ Individual File Processing: Process files separately for better context preservation
- ✨ Deterministic ID Generation: Fixed duplicate vector creation on repeated runs
- 🐛 Fixed Duplicate Vectors: Resolved issue where each run added exactly 1 duplicate vector
- 🐛 Fixed combine_documents Setting: Properly respects
combine_documents: falseconfiguration - 🚀 Clean Interrupt Handling: Improved Ctrl+C handling without verbose tracebacks
- 🔧 Type Safety: Fixed type annotations for better IDE support
- 📊 Better Search Quality: Individual file processing maintains document boundaries
- ✨ Embedding Cache: LRU cache reduces API calls by 20-30%
- ✨ Configurable Payloads: Choose content fields for n8n/LangChain/MCP compatibility
- ✨ Quality Scoring: Rank chunks by information density (0-1 scale)
- ✨ Token Counting: Track tokens for LLM context management
- 🚀 Flattened Metadata: Improved filtering performance
- 🚀 CI/CD Optimization: 10x faster (30s vs 3min)
- 🐛 Fixed formatting and import issues
- ✨ Semantic Chunking: Context-aware text splitting for 30% better retrieval
- ✨ Mistral Vision API: Extract text/content from images in PDFs
- 🚀 Improved PDF processing with image extraction
- 🐛 Fixed PDF processing edge cases
- ✨ Multi-Repository Processing: Process multiple repos with one command
- ✨ Repository Lists: YAML configuration for batch processing
- 📊 Comprehensive summary reports with statistics
- 🚀 Shared resources across repositories
- ✨ PDF Processing: Three modes (local, cloud, hybrid)
- ✨ Mistral OCR API: Cloud-based PDF extraction
- ✨ 150+ File Types: Extended file type support
- 🚀 5-15x Faster: Vectorized deduplication
- 🎉 Initial public release
- ✨ Azure OpenAI and Mistral AI support
- ✨ Basic markdown and text processing
- ✨ Qdrant integration
This project is licensed under the MIT License - see the LICENSE file for details.
- Qdrant - High-performance vector database
- Azure OpenAI - Advanced embedding models
- Mistral AI - Specialized code embeddings
- LangChain - Document processing framework
Made with ❤️ for the AI community
Transform your documentation into intelligent, searchable knowledge bases.