Changelog¶
All notable changes to this project are documented here. Format follows Keep a Changelog.
[0.5.1] - 2026-08-06¶
Fixed¶
- Documentation now points at
ragmill setup-chatfor the local model everywhere, rather thanpip install "ragmill[chat]"— a source build, and the command that fails on Windows. It was still the headline route in the README install list, both backend tables, and the installation-guide extras table. - The quickstarts in
docs/index.md,docs/quickstart.mdand the README CLI list went straight frompip installtoragmill chat, walking a new reader into the missing-model error. They now include the one-timeragmill setup-chatstep. ragmill setup-chatwas missing from the CLI reference command table.- Added tests asserting that no doc prints the wheel-index command without
--only-binary, and that any quickstart showingragmill chatalso mentionssetup-chat— the previous fix corrected three files by hand and missed six other places.
[0.5.0] - 2026-08-06¶
Added¶
ragmill setup-chatinstalls the local chat model runtime for you. It prints the package, the third-party index it comes from, and the exact pip command, then asks before installing anything (--yesskips the prompt, and is required when stdin is not a terminal). It installs into the interpreter running RAGMill rather than whicheverpipis first onPATH, and verifies the module is importable afterwards instead of trusting pip's exit code.
This cannot happen during pip install: a wheel is unpacked, never executed, so Python packaging has no post-install hook — deliberately, since npm's postinstall became a supply-chain attack vector. Making it an explicit command also keeps the non-PyPI index visible and consented to, the way playwright install and python -m spacy download do.
Fixed¶
- The documented command for installing the local model did not work.
pip install llama-cpp-python --extra-index-url …resolves tollama_cpp_python-0.3.34.tar.gz, not a wheel:--extra-index-urlmerges both indexes and pip picks the highest version across them, and PyPI carries a newer sdist-only release than the wheel index carries wheels. So the workaround for the Windows build failure triggered that very build failure. Every place this command appears — the CLI error, README, installation guide, chat guide — now passes--only-binary llama-cpp-python, which makes pip skip versions that have no wheel.
[0.4.3] - 2026-08-06¶
Changed¶
ragmill chatnow checks the configured backend before starting the REPL. Previously a missing local model was only discovered after you had typed a question — the question was lost and a raw Python traceback was printed for what is simply an optional package not being installed yet. It now exits cleanly with status 1 and a message.- The "local model not installed" message leads with the single command that installs it (
pip install llama-cpp-python --extra-index-url …) and no longer suggests the Gemini or OpenAI backends. Someone running the local backend asked for local chat; offering a hosted service that needs an API key is a detour, not an answer. It also no longer suggestspip install "ragmill[chat]", which is a source build and the exact thing that fails on Windows.
[0.4.2] - 2026-08-06¶
Fixed¶
- Text files are now decoded by their actual encoding instead of being read as UTF-8 with
errors="ignore". The old behaviour corrupted files silently, which mattered most on Windows because it is what Notepad writes: - "Unicode" (UTF-16) decoded as UTF-8 produced NUL-interleaved mojibake (
T\x00h\x00e\x00…). The file ingested "successfully", but its chunks embedded as noise and never matched a query — a.txtfile that appeared not to work at all. - "ANSI" (cp1252) lost every non-ASCII byte, turning
costs £50intocosts 50— a silent change of meaning rather than a visible failure. - UTF-8 with BOM left a stray
at the head of the first chunk.
Byte-order marks are now honoured (UTF-8/16/32, and the BOM is stripped rather than left in the text), BOM-less UTF-16 is detected via interior NULs, and non-UTF-8 files fall back to cp1252 then latin-1 with a warning naming the encoding used. This applies to every text reader — plain text (.txt, .md, .log, .rst), .csv/.tsv, .html, and .rtf — all four of which had the same flaw.
[0.4.1] - 2026-08-05¶
Fixed¶
- Errors for missing system binaries now name a command for the user's own OS.
tesseractand poppler'spdftoppmcannot come from pip, and the messages previously suggestedbrew installon every platform — useless on Windows and Linux. The scanned-PDF error also mentionsenable_ocr=Falsefor opting out rather than only how to opt in. - The "local chat backend unavailable" error no longer points solely at
pip install "ragmill[chat]", which is the command that fails on Windows. It now leads with the prebuilt-wheel index, explains why the package is not in[all], and offers the hosted Gemini/OpenAI backends that need no local model. pip install ragmill[all]no longer fails on a clean machine. Theall(anddev) extras pulledllama-cpp-python, which ships no PyPI wheels for recent versions, so pip fell back to a 70MB+ sdist that vendors llama.cpp — that needs a C++ toolchain, and on Windows the vendored tree exceeds the 260-charMAX_PATHlimit, aborting the whole install withOSError: [Errno 2] No such file or directory. The local LLM is now opt-in: install a prebuilt wheel withpip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu(no compiler needed), or use the hostedchat-gemini/chat-openaibackends, which are included in[all].pip install "ragmill[chat]"still works if you have CMake and a C++ toolchain — and, on Windows, long paths enabled.- Source distributions are built from an explicit allowlist. The sdist previously included every file
.gitignoredid not exclude, so a locally built tarball could sweep in a maintainer's untracked working directories. Releases built by CI were unaffected.
[0.4.0] - 2026-07-24¶
Added¶
- Extended file-format support:
.csv/.tsv(stdlib, no extra), plus.html/.htm,.rtf,.xlsx, and.pptxvia the newofficeextra (pip install ragmill[office]). - OCR support via the new
ocrextra (pip install ragmill[ocr]): text extraction from images (.png,.jpg,.jpeg,.tiff,.bmp,.gif) and automatic fallback to OCR for scanned/image-only PDFs (requires the systemtesseractbinary, andpdftoppm/poppler for PDFs). - DOCX extraction now also captures table cell text, not just paragraphs.
Changed¶
- Chat answers now lead with a direct answer followed by a brief 2–4 sentence explanation, and no longer embed bracketed citation markers (
[1],[report.pdf]) — sources are listed separately by the caller. - The ingestion engine now skips files that yield no extractable text (e.g. scanned PDFs with no OCR result) with a warning instead of storing an empty document.
[0.3.2] - 2026-07-22¶
Fixed¶
- CLI no longer requires numpy just to start:
ragmill --versionandragmill --helpnow work on a core-only install (heavy imports are deferred into the commands that need them). - Data commands that need numpy (
ingest,sync,search,count,export,import) now fail with a clear "installragmill[embeddings]" message instead of a rawModuleNotFoundError: numpy.
[0.3.1] - 2026-07-22¶
Added¶
ragmill --versionprints the installed version, andragmill.__version__exposes it programmatically.
[0.3.0] - 2026-07-22¶
Added¶
- CLI entry point (
ragmillcommand) with subcommands:ingest,sync,search,chat,count,serve,export,import,configure. - REST API server (
ragmill serve) with FastAPI — endpoints for ingest, sync, search, chat, export, import, count, health. - Retrieval-augmented chat via three backends: local GGUF model (
ragmill[chat]), Gemini (ragmill[chat-gemini]), OpenAI (ragmill[chat-openai]). - Standalone config UI (
ragmill configure) for setting up cloud backends and chat keys without editing.envby hand. - Pinecone cloud vector store backend (
ragmill[pinecone]). - Qdrant cloud vector store backend (
ragmill[qdrant]). - JSONL export/import for backup and cross-backend migration.
RAGMillConfigcentralizes all settings in a single dataclass, loaded from env vars /.env.- Configurable embedding dimension (
RAGMILL_EMBEDDING_DIM). - Batched embedding and upsert operations for better throughput.
- Docker support with
docker-compose.yml(SQLite and Qdrant profiles).
Changed¶
- Default SQLite path is now
./ragmill.db(was:memory:) — data persists across CLI invocations. - Server binds to
127.0.0.1by default (was0.0.0.0) — not exposed to the network unless explicitly configured. config-uiextra now includes FastAPI, uvicorn, pydantic, and numpy soragmill configureworks out of the box.serverextra now includespython-dotenvso.envfiles are loaded automatically.- Pinecone
RAGMILL_PINECONE_ENVIRONMENTis now honored (parses region from formats likeus-west-2,us-west1-gcp).
[0.2.0]¶
Added¶
EmbeddingModel(ragmill.embeddings) — local ONNX-based sentence embeddings via a quantized MiniLM model, downloaded once and cached offline.VectorStore(ragmill.vector_store) — SQLite-backed storage with brute-force cosine similarity search, plus filtering byfilename,source_file,modified_after,modified_before.sync_directory(ragmill.sync) — incremental sync between a folder and aVectorStore: skips unchanged files (content-hash based), replaces chunks for changed files, removes chunks for deleted files.modified_atis now captured during ingestion and threaded through chunk metadata.
Changed¶
- Project renamed to RAGMill. The original name,
nexus-flow, was already taken on PyPI by an unrelated package; the next candidate,nexusflow, was rejected by PyPI for being confusingly similar to it. Package name is nowragmill, and the import path changed accordingly:import ragmill(previouslyimport nexus_flow). The main class was renamedNexusEngine→RAGEngineto match.
[0.1.0]¶
Added¶
RAGEngine— directory ingestion (.txt,.md,.log,.rst,.pdfviapypdf,.docxviapython-docx) and semantic chunking with paragraph/sentence-boundary splitting and configurable overlap.- Optional extras (
pdf,docx,all,dev) so the core package has zero hard dependencies.
The latest release is available on PyPI and GitHub Releases.