Async-first version tracking system for RAG applications
Project description
๐ RAGVersion
Async-first version tracking system for RAG applications
Documentation โข Roadmap โข Contributing โข PyPI
RAGVersion is a plug-and-play module that tracks document changes and integrates seamlessly with LangChain, LlamaIndex, and other RAG frameworks. It provides automatic version control, change detection, and content diffing for your document pipelines.
Key Features โข Quick Start โข Integrations โข CLI โข Documentation
โจ Features
Core Capabilities
|
Integrations & Storage
|
๐ฏ Why RAGVersion?
Problem: RAG applications need to track when documents change to keep vector databases in sync, but most solutions require manual tracking or complex pipelines.
Solution: RAGVersion automatically detects document changes and provides version history, making it easy to maintain up-to-date RAG systems.
Perfect for:
- ๐ Documentation sites that need to track content updates
- ๐ค AI chatbots that need fresh knowledge bases
- ๐ Data pipelines processing evolving documents
- ๐ Systems requiring audit trails of document changes
๐ฆ Installation
# Basic installation
pip install ragversion
# With all parsers
pip install ragversion[parsers]
# With REST API support
pip install ragversion[api]
# With LangChain integration
pip install ragversion[langchain]
# With LlamaIndex integration
pip install ragversion[llamaindex]
# Everything (recommended)
pip install ragversion[all]
System Requirements:
- Python 3.9+
- (Optional) Supabase account for cloud storage
๐ Optional Dependencies
parsers- PDF, DOCX, and other document parserslangchain- LangChain framework integrationllamaindex- LlamaIndex framework integrationall- All optional dependencies
๐ Quick Start
Zero-Config Setup (SQLite - Recommended for Getting Started)
# 1. Install RAGVersion
pip install ragversion[all]
# 2. Start tracking immediately - no configuration needed!
ragversion track ./documents
# That's it! RAGVersion uses SQLite by default (ragversion.db)
Basic Usage (Python)
import asyncio
from ragversion import AsyncVersionTracker
from ragversion.storage import SQLiteStorage
async def main():
# Initialize tracker with SQLite (zero configuration)
tracker = AsyncVersionTracker(
storage=SQLiteStorage() # Creates ragversion.db automatically
)
# Track a single file
change = await tracker.track("document.pdf")
if change:
print(f"Document changed: {change.change_type}")
# Track a directory (batch processing)
result = await tracker.track_directory(
"./documents",
patterns=["*.pdf", "*.docx"],
recursive=True
)
print(f"โ
Processed: {len(result.successful)} files")
print(f"โ Failed: {len(result.failed)} files")
asyncio.run(main())
โ๏ธ Cloud Setup (Supabase - For Production/Collaboration)
# 1. Install RAGVersion
pip install ragversion[all]
# 2. Set environment variables
export SUPABASE_URL="https://your-project.supabase.co"
export SUPABASE_SERVICE_KEY="your-service-key"
# 3. Configure backend
echo "storage:
backend: supabase
supabase:
url: \${SUPABASE_URL}
key: \${SUPABASE_SERVICE_KEY}" > ragversion.yaml
# 4. Initialize database
ragversion migrate
# 5. Start tracking!
ragversion track ./documents
Python usage with Supabase:
from ragversion.storage import SupabaseStorage
async def main():
tracker = AsyncVersionTracker(
storage=SupabaseStorage.from_env()
)
# ... rest of your code
โ๏ธ Configuration
Default (SQLite) - No Configuration Required
RAGVersion works out of the box with SQLite. No setup needed!
# Just start tracking - uses ragversion.db by default
ragversion track ./documents
Custom Configuration File (Optional)
Create a ragversion.yaml file for advanced settings:
storage:
backend: sqlite # or "supabase" for cloud storage
sqlite:
db_path: ragversion.db
content_compression: true
tracking:
store_content: true
max_file_size_mb: 50
batch:
max_workers: 4
on_error: continue
content:
compression: gzip
ttl_days: 365
Switching to Supabase (Cloud Storage)
For production or team collaboration:
storage:
backend: supabase
supabase:
url: ${SUPABASE_URL}
key: ${SUPABASE_SERVICE_KEY}
Or use environment variables:
export RAGVERSION_STORAGE_BACKEND=supabase
export SUPABASE_URL="https://your-project.supabase.co"
export SUPABASE_SERVICE_KEY="your-service-key"
๐ง Advanced Configuration Options
# Full configuration example with all options
storage:
backend: supabase
supabase:
url: ${SUPABASE_URL}
key: ${SUPABASE_SERVICE_KEY}
connection_timeout: 30
retry_attempts: 3
tracking:
store_content: true
max_file_size_mb: 50
hash_algorithm: sha256
batch:
max_workers: 4
on_error: continue
timeout_seconds: 300
content:
compression: gzip
compression_level: 6
ttl_days: 365
notifications:
enabled: true
notifiers:
- type: slack
name: team-slack
enabled: true
webhook_url: ${SLACK_WEBHOOK_URL}
- type: discord
name: dev-discord
enabled: true
webhook_url: ${DISCORD_WEBHOOK_URL}
- type: email
name: admin-email
enabled: true
smtp_host: smtp.gmail.com
smtp_port: 587
smtp_username: ${EMAIL_USERNAME}
smtp_password: ${EMAIL_PASSWORD}
from_address: ragversion@company.com
to_addresses:
- admin@company.com
events:
enabled: true
handlers:
- type: webhook
url: https://your-webhook-url.com
โก GitHub Actions Integration
Automatically track documentation changes in your CI/CD pipeline:
# .github/workflows/track-docs.yml
name: Track Documentation
on:
push:
branches: [main]
paths: ['docs/**', '*.md']
jobs:
track:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Track documentation with RAGVersion
uses: sourangshupal/ragversion/.github/actions/ragversion-track@v0.4.0
with:
paths: 'docs/ README.md'
storage-backend: 'sqlite'
file-patterns: '*.md *.txt *.pdf'
Benefits:
- โ Automatic tracking on every commit
- โ PR documentation validation
- โ Scheduled tracking jobs
- โ Zero manual intervention
- โ Archive tracking history as artifacts
Common Use Cases:
|
PR Checks on:
pull_request:
types: [opened, synchronize]
jobs:
check-docs:
steps:
- uses: sourangshupal/ragversion/.github/actions/ragversion-track@v0.4.0
with:
paths: 'docs/'
fail-on-error: true
|
Scheduled Tracking on:
schedule:
- cron: '0 0 * * *' # Daily
jobs:
track:
steps:
- uses: sourangshupal/ragversion/.github/actions/ragversion-track@v0.4.0
with:
paths: 'docs/ examples/'
max-workers: 8
|
๐ Full documentation: docs/GITHUB_ACTIONS.md
๐ Real-Time File Watching
Automatically track document changes without manual intervention:
# Start watching a directory
ragversion watch ./docs
# Watch only Markdown files
ragversion watch ./docs --pattern "*.md"
# Watch multiple directories
ragversion watch ./docs ./guides --pattern "*.md" --pattern "*.txt"
Features:
- โ Real-time change detection (create, modify, delete)
- โ Pattern matching for specific file types
- โ Recursive directory watching
- โ Automatic debouncing
- โ Custom change callbacks
- โ Daemon mode for 24/7 monitoring
Python API:
from ragversion import watch_directory
async def on_change(change):
print(f"๐ {change.change_type.value}: {change.file_name}")
async def main():
async with AsyncVersionTracker(storage=storage) as tracker:
await watch_directory(
tracker,
"./docs",
patterns=["*.md", "*.txt"],
on_change=on_change
)
asyncio.run(main())
Use Cases:
- ๐ Development environment (auto-track while editing)
- ๐ Production monitoring (24/7 daemon mode)
- ๐ Custom notifications (Slack, email, webhooks)
- ๐ค RAG integration (auto-update vector stores)
๐ Full documentation: docs/FILE_WATCHING.md
๐ Notifications
Get real-time alerts when documents change via Slack, Discord, Email, or custom webhooks.
# ragversion.yaml
notifications:
enabled: true
notifiers:
- type: slack
name: team-slack
enabled: true
webhook_url: ${SLACK_WEBHOOK_URL}
mention_on_types: ["deleted"] # Mention users for deletions
- type: discord
name: dev-discord
enabled: true
webhook_url: ${DISCORD_WEBHOOK_URL}
- type: email
name: admin-email
enabled: true
smtp_host: smtp.gmail.com
smtp_port: 587
smtp_username: ${EMAIL_USERNAME}
smtp_password: ${EMAIL_PASSWORD}
from_address: ragversion@company.com
to_addresses:
- admin@company.com
Supported Providers:
- ๐ฌ Slack - Rich formatted messages with user mentions
- ๐ฎ Discord - Embed-based notifications with role mentions
- ๐ง Email - HTML/plain text via SMTP
- ๐ Webhook - Custom HTTP endpoints for any integration
Features:
- โ Multiple providers simultaneously
- โ Parallel or sequential delivery
- โ Conditional notifications (e.g., only for deletions)
- โ User/role mentions
- โ Custom metadata in messages
- โ Automatic retry and error handling
CLI Usage:
# Notifications are sent automatically with file watching
ragversion watch ./documents --config ragversion.yaml
Python API:
from ragversion.notifications import create_notification_manager
from ragversion.config import RAGVersionConfig
# Load config with notifications
config = RAGVersionConfig.load("ragversion.yaml")
notification_manager = create_notification_manager(
config.notifications.notifiers
)
# Create tracker with notifications
tracker = AsyncVersionTracker(
storage=storage,
notification_manager=notification_manager
)
async with tracker:
await tracker.track("./documents/report.pdf")
# Notifications sent automatically
๐ Full documentation: docs/NOTIFICATIONS.md ๐ Examples: examples/notifications/
๐ Integrations
RAGVersion seamlessly integrates with popular RAG frameworks:
๐ฆ LangChainfrom ragversion.integrations.langchain import LangChainSync
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Qdrant
sync = LangChainSync(
tracker=tracker,
text_splitter=RecursiveCharacterTextSplitter(
chunk_size=1000
),
embeddings=OpenAIEmbeddings(),
vectorstore=qdrant_client
)
# Automatically sync only changed documents
await sync.sync_directory("./documents")
Features:
|
๐ฆ LlamaIndexfrom ragversion.integrations.llamaindex import LlamaIndexSync
from llama_index.core import VectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter
sync = LlamaIndexSync(
tracker=tracker,
node_parser=SentenceSplitter(
chunk_size=1024
),
index=vector_index
)
# Keep your index in sync effortlessly
await sync.sync_directory("./documents")
Features:
|
๐ฏ Custom Integrations
RAGVersion's modular design makes it easy to integrate with any RAG framework:
from ragversion import AsyncVersionTracker
async def custom_sync(tracker, documents_path):
result = await tracker.track_directory(documents_path)
for change in result.successful:
if change.change_type in ["created", "modified"]:
# Your custom processing logic
await process_document(change.document)
๐ฅ๏ธ CLI
RAGVersion includes a powerful command-line interface for managing document versions:
๐ Basic Commands# Initialize a new project
ragversion init
# Track files or directories
ragversion track ./documents
# List tracked documents
ragversion list
# Run database migrations
ragversion migrate
|
๐ Version Management# View document history
ragversion history <document-id>
# Get document diff between versions
ragversion diff <document-id> --versions 1 2
# Show version details
ragversion show <version-id>
|
๐ก CLI Examples
# Track all PDFs in a directory recursively
ragversion track ./documents --pattern "*.pdf" --recursive
# List recently changed documents
ragversion list --recent 10
# Export version history
ragversion export --format json --output history.json
# Show configuration
ragversion config show
๐ See all CLI commands
ragversion --help
Commands:
init Initialize RAGVersion in the current directory
track Track files or directories for changes
list List tracked documents
history Show version history for a document
diff Show differences between versions
show Show detailed version information
migrate Run database migrations
config Manage configuration
export Export version history
import Import version history
status Show tracking status
validate Validate configuration
๐ฅ๏ธ Web Interface
RAGVersion includes a simple, clean web interface perfect for content teams and non-technical users:
# Start the server (includes web UI + REST API)
ragversion serve
# Access the web interface
# Dashboard: http://localhost:8000/
# Documents: http://localhost:8000/documents
Web UI Features:
- ๐ Dashboard - Statistics overview, top documents, file type distribution
- ๐ Document Browser - Search, filter, and browse all tracked documents
- ๐ Version History - View complete version timeline for each document
- ๐ Visual Diff Viewer - Compare versions with color-coded changes
- ๐จ Clean Design - Modern, responsive interface with intuitive navigation
- ๐ Fast & Lightweight - Server-side rendering, no heavy JavaScript frameworks
Perfect for:
- Content managers who need to track document changes visually
- Non-technical stakeholders who want quick insights
- Teams that prefer web interfaces over command-line tools
- Quick browsing and searching through document history
Screenshots:
|
Dashboard View:
|
Document Detail:
|
๐ REST API
RAGVersion also provides a comprehensive REST API for programmatic access from any language or platform:
# Start the API server (same command as web UI)
ragversion serve
# Custom host and port
ragversion serve --host localhost --port 5000
# Development mode with auto-reload
ragversion serve --reload
API Features:
- ๐ FastAPI-based - Modern async web framework
- ๐ Auto documentation - Swagger UI at
/api/docs, ReDoc at/api/redoc - ๐ Optional auth - API key authentication via
X-API-Keyheader - ๐ CORS support - Configurable cross-origin requests
- โก Async operations - Non-blocking request handling
- โ Type validation - Automatic request/response validation with Pydantic
Quick API Examples
|
Python: import requests
BASE_URL = "http://localhost:8000/api"
# Track a file
response = requests.post(
f"{BASE_URL}/track/file",
json={"file_path": "/path/to/doc.pdf"}
)
event = response.json()
# List documents
docs = requests.get(
f"{BASE_URL}/documents?limit=10"
).json()
# Get statistics
stats = requests.get(
f"{BASE_URL}/statistics"
).json()
|
JavaScript: const BASE_URL = "http://localhost:8000/api";
// Track a file
const response = await fetch(
`${BASE_URL}/track/file`,
{
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({
file_path: "/path/to/doc.pdf"
})
}
);
const event = await response.json();
// Get version history
const versions = await fetch(
`${BASE_URL}/versions/document/${docId}`
).then(r => r.json());
|
cURL Examples:
# Track directory
curl -X POST http://localhost:8000/api/track/directory \
-H "Content-Type: application/json" \
-d '{"dir_path": "/docs", "patterns": ["*.md"]}'
# Get diff between versions
curl "http://localhost:8000/api/versions/document/<doc-id>/diff/1/3"
# Health check
curl http://localhost:8000/api/health
API Endpoints:
/api/documents- Document management (list, get, search, delete)/api/versions- Version management (list, get, content, diff, restore)/api/track- Tracking operations (file, directory)/api/statistics- Analytics and statistics/api/health- Server health check
See the API Guide for complete documentation.
โฐ Batch Processing & Automation
Cron Job Example
Create a scheduled sync script:
#!/usr/bin/env python3
"""sync_documents.py - Cron job to sync documents"""
import asyncio
import logging
from ragversion import AsyncVersionTracker, SupabaseStorage
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def sync_documents():
"""Sync all documents in the directory"""
tracker = AsyncVersionTracker(
storage=SupabaseStorage.from_env()
)
result = await tracker.track_directory(
"./documents",
patterns=["*.pdf", "*.docx"],
recursive=True
)
logger.info(f"โ
Synced {len(result.successful)} documents")
if result.failed:
logger.error(f"โ Failed to process {len(result.failed)} documents")
for error in result.failed:
logger.error(f" - {error.file_path}: {error.error}")
if __name__ == "__main__":
asyncio.run(sync_documents())
Schedule with Crontab
# Edit crontab
crontab -e
# Add this line to sync every hour
0 * * * * /path/to/venv/bin/python /path/to/sync_documents.py >> /var/log/ragversion.log 2>&1
# Or sync every 15 minutes
*/15 * * * * /path/to/venv/bin/python /path/to/sync_documents.py >> /var/log/ragversion.log 2>&1
Use with GitHub Actions
name: Sync Documents
on:
schedule:
- cron: '0 * * * *' # Every hour
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: pip install ragversion[all]
- name: Sync documents
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_KEY: ${{ secrets.SUPABASE_SERVICE_KEY }}
run: ragversion track ./documents
๐๏ธ Architecture
RAGVersion follows a modular, async-first architecture designed for production systems:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ AsyncVersionTracker โ
โ (Core Tracking Engine) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโ โโโโโโโโโโโโโผโโโโโโโโโโโโโ
โ Storage Backends โ โ Document Parsers โ
โ - Supabase (current) โ โ - PDF, DOCX, TXT โ
โ - PostgreSQL (future) โ โ - Markdown, CSV โ
โ - SQLite (future) โ โ - Pluggable system โ
โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Core Components โ
โ โข Change Detector (hashing & diffs) โ
โ โข Event System (async callbacks) โ
โ โข Batch Processor (error handling) โ
โ โข Compression & Storage optimization โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Key Components
| Component | Description | Status |
|---|---|---|
| AsyncVersionTracker | Core tracking engine with async/await support | โ Stable |
| Storage Backends | Abstract storage interface (Supabase implemented) | โ Stable |
| Document Parsers | Pluggable parsers for various file formats | โ Stable |
| Change Detector | Content hashing and intelligent diff generation | โ Stable |
| Event System | Async callbacks for change notifications | โ Stable |
| Batch Processor | Resilient batch processing with error recovery | โ Stable |
๐ก๏ธ Error Handling
RAGVersion uses a continue-on-error approach designed for production resilience:
result = await tracker.track_directory("./documents")
# Detailed error reporting
print(f"โ
Successful: {len(result.successful)}")
print(f"โ Failed: {len(result.failed)}")
# Handle failures gracefully
if result.failed:
for error in result.failed:
print(f"Failed: {error.file_path}")
print(f"Reason: {error.error}")
print(f"Type: {error.error_type}") # "parsing" | "storage" | "unknown"
# Retry logic for specific error types
if error.error_type == "parsing":
# Handle parsing errors
pass
elif error.error_type == "storage":
# Handle storage errors
pass
Error Types
| Error Type | Description | Recommended Action |
|---|---|---|
parsing |
Failed to parse document content | Check file format, update parsers |
storage |
Failed to save to database | Check connection, retry |
validation |
Invalid configuration or input | Fix configuration |
unknown |
Unexpected error | Review logs, report issue |
๐งช Testing
RAGVersion includes testing utilities for integration tests:
from ragversion.testing import MockStorage, create_sample_documents
async def test_integration():
# Use in-memory mock storage for testing
tracker = AsyncVersionTracker(storage=MockStorage())
# Generate sample test documents
docs = create_sample_documents(count=10, file_type="pdf")
# Test your integration
results = []
for doc in docs:
result = await tracker.track(doc.path)
results.append(result)
# Assertions
assert len(results) == 10
assert all(r.change_type == "created" for r in results)
Running Tests
# Install dev dependencies
pip install -e ".[dev]"
# Run all tests
pytest
# Run with coverage
pytest --cov=ragversion --cov-report=html
# Run specific test file
pytest tests/test_tracker.py
๐ Documentation
๐ Complete GuideDOCUMENTATION.md - Comprehensive documentation covering:
|
๐ Roadmapfuture-enhancements.md - What's coming next:
|
๐ผ Use Cases
๐ Documentation Versioning
Track changes to documentation sites and keep chatbots up-to-date:
# Monitor docs directory and update vector store
async def monitor_docs():
tracker = AsyncVersionTracker(storage=SupabaseStorage.from_env())
sync = LangChainSync(tracker=tracker, vectorstore=qdrant)
while True:
result = await sync.sync_directory("./docs")
print(f"Updated {len(result.successful)} documents")
await asyncio.sleep(300) # Check every 5 minutes
๐ค AI Chatbot Knowledge Base
Maintain fresh knowledge bases for AI assistants:
# Sync changed documents to chatbot's knowledge base
async def update_chatbot_kb():
tracker = AsyncVersionTracker(storage=SupabaseStorage.from_env())
result = await tracker.track_directory("./knowledge-base")
for change in result.successful:
if change.change_type in ["created", "modified"]:
await chatbot.update_knowledge(change.document)
๐ Data Pipeline Monitoring
Track document changes in data processing pipelines:
# Monitor source documents and trigger pipeline
async def pipeline_monitor():
tracker = AsyncVersionTracker(storage=SupabaseStorage.from_env())
result = await tracker.track_directory("./data/input")
# Trigger processing only for changed files
for change in result.successful:
if change.change_type != "unchanged":
await trigger_pipeline(change.document)
๐ Compliance & Audit Trails
Maintain complete audit trails of document changes:
# Track all changes with full history
async def audit_documents():
tracker = AsyncVersionTracker(storage=SupabaseStorage.from_env())
# Get complete version history
history = await tracker.get_history(document_id)
for version in history:
print(f"{version.timestamp}: {version.change_type}")
print(f"Content hash: {version.content_hash}")
โก Performance
RAGVersion is built for production scale:
| Metric | Performance |
|---|---|
| Batch Processing | 100+ docs/second |
| Memory Footprint | < 50MB base |
| Storage Overhead | ~10% (with compression) |
| Async Operations | Non-blocking I/O |
| Scalability | Horizontal scaling ready |
Optimization Tips
# Use batch processing for large directories
result = await tracker.track_directory(
"./documents",
batch_size=50, # Process 50 files at a time
max_workers=4 # Use 4 parallel workers
)
# Enable compression to reduce storage
tracker = AsyncVersionTracker(
storage=SupabaseStorage.from_env(),
compression="gzip" # or "zstd" for better compression
)
๐ Requirements
- Python: 3.9+
- Database: Supabase account (free tier available at supabase.com)
- Optional: Redis for caching (future feature)
๐ License
RAGVersion is released under the MIT License. See LICENSE file for details.
MIT License - Free for personal and commercial use
โ
Private use โ
Commercial use โ
Modification โ
Distribution
๐ค Contributing
We welcome contributions! Here's how you can help:
๐ Report BugsFound a bug? Open an issue |
โจ Request FeaturesHave an idea? Start a discussion |
๐ง Submit PRsWant to contribute code? Read guidelines |
Quick Links:
๐ Show Your Support
If you find RAGVersion helpful, please consider:
- โญ Starring this repository
- ๐ฆ Sharing on social media
- ๐ Writing a blog post about your experience
- ๐ฌ Contributing to discussions
- ๐ Reporting bugs or suggesting features
๐ Support & Community
๐ Documentation |
๐ Issues |
๐ฌ Discussions |
๐ฆ PyPI |
๐บ๏ธ Roadmap
Check out our detailed roadmap to see what's coming next!
High Priority Features:
- ๐ Real-time file watching
- ๐พ SQLite & PostgreSQL backends
- ๐ Haystack & Weaviate integrations
- ๐ REST API server
- ๐ฅ๏ธ Web UI dashboard
- ๐ Enterprise security features
๐ Project Stats
Made with โค๏ธ by the RAGVersion Team
โญ Star on GitHub โข ๐ฆ Install from PyPI โข ๐ Read the Docs
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ragversion-0.10.0.tar.gz.
File metadata
- Download URL: ragversion-0.10.0.tar.gz
- Upload date:
- Size: 611.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d051c301b1ceef122c22da43b2e12de0f77e6da5ab5da80b25a92d51d6bad2fd
|
|
| MD5 |
ae208a923b91e56748684cccf5bc800e
|
|
| BLAKE2b-256 |
4ed90a048967555c66a5159673ba015805ce8ea28d4e9318c9ef04bc6ae091a4
|
File details
Details for the file ragversion-0.10.0-py3-none-any.whl.
File metadata
- Download URL: ragversion-0.10.0-py3-none-any.whl
- Upload date:
- Size: 107.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb8ccdeaa17936b0100e902ad7efcbf6c577436708079a8fd19486bc7edee106
|
|
| MD5 |
106069afba115825c8f6cf82ed73a4c0
|
|
| BLAKE2b-256 |
b8f156174317ffabc837066ad6305eda8531dfaf76321241f46941b51a1a01c1
|