Skip to content

Chroma: update ChromaDotNet.Client to 2.20.0, offer hybrid search on distributed Chroma - #84

Merged
adamsitnik merged 6 commits into
CommunityToolkit:mainfrom
Laurianti:chroma-2-19
Nov 9, 2026
Merged

adamsitnik merged 6 commits into
CommunityToolkit:mainfrom
Laurianti:chroma-2-19

Conversation

@Laurianti

@Laurianti Laurianti commented Nov 6, 2026 •

Copy link
Copy Markdown
Member

Follow-up to #75.

Changes

  • Hybrid search on distributed Chroma, the one Chroma Cloud runs on, installed elsewhere, like with the Helm chart of Chroma or an operator, and on the servers that declare sparse vector indexes in pre-flight-checks. Before, GetService offered IKeywordHybridSearchable only on Chroma Cloud. Now it asks the client whether the server takes sparse vector indexes, the same check the client makes before it creates the BM25 indexes. Distributed Chroma installed elsewhere is named with Distributed=true in the connection string, or WithDistributedChroma() in the options of the client.
  • On a single Chroma server nothing changes: no IKeywordHybridSearchable, and a hybrid search throws InvalidOperationException. Its message now names the servers that have BM25 indexes and the setting for distributed Chroma, instead of "Only Chroma Cloud has BM25 indexes". On distributed Chroma, a collection without the index says that it was created without it, as on Chroma Cloud, without the key quota, which only Chroma Cloud has.
  • @adamsitnik, the collection no longer keeps the answer in a nullable field, as you asked in Chroma: update ChromaDotNet.Client to 2.18.1, reject chroma: storage names, explain missing BM25 indexes on Chroma Cloud #75: the client keeps it now. After its first answer, the client answers from it without a request. When the server does not answer yet, for example while it starts, the client answers from its options and asks the server again 30 seconds later; a field in the collection would keep that first false until the collection is created again.
  • ChromaDotNet.Client from 2.18.1 to 2.20.0: see its release notes. For the provider: on distributed Chroma, a write that the server refuses because its log needs compaction goes again, and Contains on the full-text property throws ArgumentException for a text of fewer than 3 characters, as on Chroma Cloud.
  • The hybrid search conformance tests run where the server takes sparse vector indexes, as the client tells it, instead of only on a Chroma Cloud address.
  • README: where hybrid search works; Contains under 3 characters on distributed Chroma.
  • Provider version bumped to 1.1.0-preview.

Tests

  • Unit tests: 183 passed. 3 are new and 2 rewritten: 4 of them fail without the change, and the fifth checks that a collection without full-text properties does not ask the server.
  • Conformance tests, net10.0 and net472:
    • on chromadb/chroma:1.5.9: 218 and 216 passed, 7 skipped, as on main. The 7 skipped are the hybrid search tests;
    • on Chroma Cloud, on distributed Chroma with Distributed=true, and on a server that declares sparse vector indexes: 225 and 223 passed, none skipped.
  • A collection asked for IKeywordHybridSearchable before the server was up: not offered. Once the server answered, it was offered without a restart, and 10,000 more calls sent no request.
  • Differential fuzzing against an in-memory reference on chromadb/chroma:1.5.9: 20 seeds of 500 cases, and two more cultures. No difference beyond the known defects of Chroma 1.5.9 under concurrent writes.
  • The same fuzzing on Chroma Cloud: 8 seeds of 150 cases, and one more culture, all passed.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No active review issues block approval of the hybrid-search capability changes.

No open issues 🎉

What changed in this PR

Extends the Chroma vector-store provider’s hybrid search support beyond Chroma Cloud to distributed deployments and servers that advertise sparse vector indexes, following up on #75.

Changes:

  • Uses client-managed capability detection instead of caching hybrid search availability in each collection, and clarifies missing-index errors.
  • Updates ChromaDotNet.Client to 2.20.0 and the provider to 1.1.0-preview.
  • Adds unit coverage, makes conformance tests capability-based, and documents distributed Chroma support and limitations.
File Description
MEVD/​test/​Chroma.UnitTests/​ChromaCollectionTests.cs Tests capability changes, skipped probes, and missing-index diagnostics.
MEVD/​test/​Chroma.ConformanceTests/​testsettings.json Updates the configuration comment to mention distributed Chroma.
MEVD/​test/​Chroma.ConformanceTests/​Support/​ChromaTestStore.cs Detects sparse-vector support during store startup.
MEVD/​test/​Chroma.ConformanceTests/​README.md Documents server requirements for hybrid search tests.
MEVD/​test/​Chroma.ConformanceTests/​ChromaHybridSearchTests.cs Gates tests on server capabilities rather than Cloud addresses.
MEVD/​src/​Chroma/​README.md Documents hybrid search availability and distributed text-filter limits.
MEVD/​src/​Chroma/​ChromaCollection.cs Delegates capability detection to the client and updates diagnostics.
MEVD/​src/​Chroma/​Chroma.csproj Bumps the provider version to 1.1.0-preview.
Directory.Packages.props Upgrades ChromaDotNet.Client to 2.20.0.

Review effort: Balanced

@Laurianti
Laurianti marked this pull request as draft November 6, 2026 22:47
@Laurianti
Laurianti marked this pull request as ready for review November 6, 2026 23:09

@adamsitnik adamsitnik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall it looks very good, I've left only one question. Thank you @Laurianti !

Comment thread MEVD/src/Chroma/ChromaCollection.cs Resolved

@adamsitnik adamsitnik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, again thank you @Laurianti !

@adamsitnik
adamsitnik merged commit b0d5926 into CommunityToolkit:main Nov 9, 2026
37 of 38 checks passed
@adamsitnik

Copy link
Copy Markdown
Contributor
image

@Laurianti
Laurianti deleted the chroma-2-19 branch November 10, 2026 13:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants