Repository navigation
ChunkHound v6.0.0
This release makes the Rust-native indexing pipeline the default execution path, adds two new LLM providers (OrcaRouter, OpenRouter), and rounds out embedding, research, and MCP capabilities added since v5.2.1.
Highlights
- Rust-native indexing pipeline is now the default — parsing, embedding, and DB writes run concurrently through
chunkhound_nativefor meaningfully faster indexing (CHUNKHOUND_USE_RUST=0to opt out).chunkhound-nativeis now a required dependency rather than an optional extra. - VoyageAI
voyage-4series support, plus an index that now owns its embedding model/dimensions so a config change can no longer silently strand or empty a database. - New LLM providers: OrcaRouter and OpenRouter.
- MCP HTTP transport (
--transport http) for remote/browser-based MCP clients. - Fetchurl CLI command and MCP tool for pulling a single URL into a focused Markdown answer.
Breaking Changes
chunkhound-nativeis now a required dependency — The Rust extension is no longer an optional extra; it installs by default and its parse→embed→write pipeline runs by default (CHUNKHOUND_USE_RUST=0to opt out). Installs where no native wheel is available fall back to the Python pipeline automatically.
Added
- Rust-native indexing pipeline (default) — Indexing now runs parsing, embedding, and database writes concurrently through the
chunkhound_nativeextension by default, for meaningfully faster indexing with crash-safe recovery and more accurate progress reporting (including live DB-size-reduction stats during compaction). Falls back to the Python pipeline automatically for non-DuckDB providers (e.g. LanceDB). - OrcaRouter LLM provider — OrcaRouter is now supported as an OpenAI-compatible LLM provider (
provider: orcarouterorCHUNKHOUND_LLM_PROVIDER=orcarouter). - OpenRouter LLM provider — OpenRouter is now supported as a first-class OpenAI-compatible LLM provider (
provider: openrouterorCHUNKHOUND_LLM_PROVIDER=openrouter). - Voyage-native rerank format — Custom VoyageAI-compatible rerank endpoints (e.g. MongoDB Atlas) are now supported via
rerank_format="voyage", fixing reranking that previously silently fell back to raw vector scores against these endpoints. - Provider-managed synthesis output limits — Research synthesis output truncation is now managed per LLM provider, with explicit support for DeepSeek's and Grok's own output-limit semantics.
- Follow-up query chaining for research —
websearchandcode_researchnow accept a--previous-query/previous_queryparameter so a follow-up query is expanded and synthesized in the context of the prior topic instead of re-exploring the same ground. - MCP HTTP transport — The MCP server now supports Streamable HTTP transport (
--transport http) alongside stdio, so remote and browser-based MCP clients can connect without spawning a local subprocess. Configurable via--host/--port/--auth-token/--cors; refuses to start on a non-loopback host without an auth token. - Configurable DB execute timeout — The database serial-executor timeout can now be set via
.chunkhound.json,CHUNKHOUND_DATABASE__EXECUTE_TIMEOUT_SECONDS, or--db-execute-timeout, instead of only an internal env var. - VoyageAI
voyage-4series (voyage-code-4,voyage-4,voyage-4-large,voyage-4-lite). All four support Matryoshkaoutput_dimsof 256, 512, 1024 (default), and 2048, and a 32K context window.voyage-code-4is code-specialized and built for coding-agent retrieval, which is ChunkHound's exact use case. The default staysvoyage-3.5; setembedding.modelto opt in. - The index now owns its embedding model and dimensions. Changing
embedding.modelorembedding.output_dimsno longer silently re-embeds, or strands, an existing database. For a different model,chunkhound indexwarns, reports how many chunks a switch would rewrite, and asks; declining keeps the indexed model and dimensions, leaves search working, and asks again next run. A dimensions-only change on the same model cannot be re-embedded in place, so the indexed dimensions are kept without asking. Non-interactive runs and MCP startup keep the index's settings without prompting, so an upgraded default can never rewrite a database behind the operator's back. A configured provider change is still applied, since credentials and dimensions leave nothing to fall back to. Which model an index uses is recorded in a file beside the database, so a finished or interrupted switch is remembered rather than guessed from vector counts. DuckDB and LanceDB indexes are both covered. - Upgrade suggestions. When a newer model supersedes the one in use, an interactive
chunkhound indexprints a single informational line stating what a switch would cost. It never acts on its own and does not appear in non-interactive runs. Silence it withCHUNKHOUND_NO_MODEL_SUGGESTIONS=1. - VoyageAI model reference table in
configuration.md, listing context window and per-batch token limit for every model ChunkHound knows. - Fetchurl CLI command and MCP tool — New
chunkhound fetchurl <url> [-q "…"]CLI subcommand and matchingfetchurlMCP tool fetch a single URL (HTML or PDF), extract its content, and return a focused Markdown answer.- Short pages are token-truncated and summarized in one LLM call; long pages with a query go through a chunk + rerank + elbow-filter pipeline that passes only the most relevant sections to the LLM.
- Requires LLM + reranker providers — the MCP tool is hidden from
tools/listwhen either is missing. - Configurable via
fetchurl.rerank_threshold_tokens(default 15000),fetchurl.truncate_tokens(default 15000), andfetchurl.max_retries(default 3), or theirCHUNKHOUND_FETCHURL_*env-var equivalents. - Uses the same zendriver + system Chrome transport as
websearch, withurllibfallback.
Fixed
- OpenAI token-limit error detection — A third real-world phrasing of OpenAI's context-length error ("the input length exceeds the context length") is now recognized, triggering the existing split-and-retry path instead of failing the batch outright.
- Windows project detection — Directory discovery no longer fails when the current working directory is the user's home directory or sits under a locked-down parent on Windows.
- A changed embedding model or
output_dimssilently emptied search results. Search reads the vector table matching the query's dimensions and filters it by provider and model, so either change returned zero results. Re-indexing never repaired a dimensions change, because chunks already embedded under the model were skipped at any dimension, and a re-embed interrupted partway left two model-tagged vectors per chunk. The index's model and dimensions are now kept unless a switch is explicitly accepted. - Wrong batch token limits for the
voyage-4series. The whole series was previously unknown to the provider and fell through to the 320K-token fallback.voyage-4-largeactually caps at 120K, so large batches failed withTOO_MANY_TOKENS_IN_BATCH, whilevoyage-4-litewas capped at a third of its real 1M limit. Unsupportedoutput_dimson these models were also accepted locally and only rejected later by the API; they now fail at configuration time. - PyMuPDF
fitzimport deprecation warning on stdout — PDF parsing now importspymupdfinstead of the legacyfitzalias, which since PyMuPDF 1.28.2 prints a deprecation warning to stdout and corrupts MCP stdio clients (e.g. CURe preflight). Adds a regression test asserting parser imports write nothing to stdout.
Full changelog: https://github.com/chunkhound/chunkhound/blob/main/CHANGELOG.md