ChromaDotNet

ChromaDotNet.Client conformance: Chroma single server and Chroma Cloud

βœ“ every check passed Β· βœ— a check failed Β· ⚠ passed, with a defect of the Chroma server noted below Β· β€” not on a single server: a feature of distributed Chroma, the one Chroma Cloud runs on, and the check verified that the client reports the error of the server as documented Β· on Chroma Cloud, β€” is what an API key cannot do, with the error the check verified Β· ΒΉ a note under the table Β· a blank cell: the row is not about that column (the quotas of Chroma Cloud on a single server; on Chroma Cloud, the checks with no server or with a local container; a feature the build of the client for that column does not have, as the embeddings of a generator on .NET Core 3.1 to 7, which take the build for .NET Standard 2.0)

By feature

Chroma docs section Feature Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 Windows Β· .NET 8, 9, 10 Β· x64, x86 Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 Alpine 3.24 (musl) Β· .NET 8, 10 Β· x64 Linux (Debian 12, Ubuntu 24.04) Β· .NET 8, 10 Β· arm64 NativeAOT, Ubuntu 24.04 Β· .NET 10 Β· x64 Chroma Cloud, AWS us-east-1 Β· .NET 10 Β· x64
Run Chroma Clients: local server, Chroma Cloud, authentication βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Tenants and databases βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ΒΉ
Collections Manage collections βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Add, update, delete data (large writes in batches) βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Configure: HNSW, SPANN, embedding function βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
collections created when missing (lazy and now) βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Conditional transactions β€”Β² β€”Β² β€”Β² β€”Β² β€”Β² β€”Β² β€”Β² βœ“
Attached functions: inputs β€”Β³ β€”Β³ β€”Β³ β€”Β³ β€”Β³ β€”Β³ β€”Β³ ⚠
Querying collections Query and get: l2, cosine, ip βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Metadata filtering, array metadata βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Full-text search and regex βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Chroma Cloud Collection forking β€” β€” β€” β€” β€” β€” β€” βœ“
Schema: sparse vector search, BM25 β€” β€” β€” β€” β€” β€” β€” βœ“
Search API (basics, filtering, ranking, group by, hybrid, pagination, batch) β€” β€” β€” β€” β€” β€” β€” βœ“
Quotas & Limits: the client keeps to them or reports the error of Chroma βœ“
Beyond the Chroma docs OpenTelemetry traces and metrics βœ“ βœ“β΄ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Cancellation, timeouts, concurrent calls βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Dependency injection βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Testcontainers module βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Mocks in tests βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
BM25 vectors computed by the client βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Search and filter requests built by the client βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
Embeddings embeddings from a generator (the builds for .NET 8 and .NET Framework) βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“

ΒΉ On cloud_aws-us-east-1, β€œcreate and get a tenant” is not available: an API key of Chroma Cloud cannot create a tenant: Chroma Cloud answers 403 "Permission denied.", which the client throws as a ChromaException; on cloud_aws-us-east-1, β€œcollections in another tenant and database” is not available: an API key of Chroma Cloud cannot create a tenant for the collections of another tenant: Chroma Cloud answers 403 "Permission denied.", which the client throws as a ChromaException.
Β² On alpine_net10.0, alpine_net8.0, aot_net10.0, arm64_net10.0, arm64_net8.0, linux_net10.0, linux_net10.0_tr-TR, linux_net6.0, linux_net8.0, linux_net9.0, win32_net10.0, win32_net48, win32_net8.0, win_net10.0, win_net10.0_th-TH, win_net10.0_tr-TR, win_net462, win_net48, win_net48_de-DE, win_net48_fa-IR, win_net48_tr-TR, win_net5.0, win_net6.0, win_net6.0_ar-SA, win_net7.0, win_net8.0, win_net8.0_de-DE, win_net9.0, win_netcoreapp3.1, win_netcoreapp3.1_ja-JP, β€œbegin, get, write and commit; a conflict; RunConditionalTransactionAsync again” is not available: distributed Chroma, the one Chroma Cloud runs on, has conditional transactions for the tenants that the configuration of its frontend enables; a single server answers 404 "NotFound: POST /api/v2/tenants/default_tenant/databases/default_database/collections/{collection_id}/conditional/get", which the client throws as a ChromaException.
Β³ On alpine_net10.0, alpine_net8.0, aot_net10.0, arm64_net10.0, arm64_net8.0, linux_net10.0, linux_net10.0_tr-TR, linux_net6.0, linux_net8.0, linux_net9.0, win32_net10.0, win32_net48, win32_net8.0, win_net10.0, win_net10.0_th-TH, win_net10.0_tr-TR, win_net462, win_net48, win_net48_de-DE, win_net48_fa-IR, win_net48_tr-TR, win_net5.0, win_net6.0, win_net6.0_ar-SA, win_net7.0, win_net8.0, win_net8.0_de-DE, win_net9.0, win_netcoreapp3.1, win_netcoreapp3.1_ja-JP, β€œanother input (AddFunctionInputAsync)” is not available: distributed Chroma, the one Chroma Cloud runs on, has attached functions; a single server answers 404 "NotFound: POST /api/v2/tenants/default_tenant/databases/default_database/collections/{collection_id}/attached_functions/stats/add_input", which the client throws as a ChromaException.
⁴ On win_netcoreapp3.1, win_netcoreapp3.1_ja-JP, β€œthe duration histogram and its buckets, with the OpenTelemetry SDK” is not available: the OpenTelemetry SDK exports no metric on this runtime, also from a meter of its own.

Same answers in every environment

The seeded fuzz of the test bench sends the same random requests from each environment to a fresh Chroma 1.5.9 and compares what comes back, suite by suite, with the answers on win_net10.0: 30 environments, two seeds. βœ“ the same answers in every environment of the column, βœ— different somewhere.

Suite Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 Windows Β· .NET 8, 9, 10 Β· x64, x86 Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 Alpine 3.24 (musl) Β· .NET 8, 10 Β· x64 Linux (Debian 12, Ubuntu 24.04) Β· .NET 8, 10 Β· arm64 NativeAOT, Ubuntu 24.04 Β· .NET 10 Β· x64
bm25 βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
concurrency βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
documents βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
edges βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
embeddings βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
filters βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
metadata βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
names βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
paging βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“
serialization βœ“ βœ“ βœ“ βœ“ βœ“ βœ“ βœ“

Environments

Column Environment System Architecture Runtime Client build Culture Checks
Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 win_net462 Microsoft Windows 10.0.26200 X64 .NET Framework 4.8.9363.0 .NETFramework,Version=v4.6.2 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 win32_net48 Microsoft Windows 10.0.26200 X86 .NET Framework 4.8.9363.0 .NETFramework,Version=v4.6.2 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 win_net48 Microsoft Windows 10.0.26200 X64 .NET Framework 4.8.9363.0 .NETFramework,Version=v4.6.2 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 win_net48_de-DE Microsoft Windows 10.0.26200 X64 .NET Framework 4.8.9363.0 .NETFramework,Version=v4.6.2 de-DE 65 βœ“ Β· 5 β€”
Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 win_net48_fa-IR Microsoft Windows 10.0.26200 X64 .NET Framework 4.8.9363.0 .NETFramework,Version=v4.6.2 fa-IR 65 βœ“ Β· 5 β€”
Windows Β· .NET Framework 4.6.2, 4.8 Β· x64, x86 win_net48_tr-TR Microsoft Windows 10.0.26200 X64 .NET Framework 4.8.9363.0 .NETFramework,Version=v4.6.2 tr-TR 65 βœ“ Β· 5 β€”
Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 win_netcoreapp3.1 Microsoft Windows 10.0.26200 X64 .NET Core 3.1.28 .NETStandard,Version=v2.0 en-GB 60 βœ“ Β· 6 β€”
Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 win_netcoreapp3.1_ja-JP Microsoft Windows 10.0.26200 X64 .NET Core 3.1.28 .NETStandard,Version=v2.0 ja-JP 60 βœ“ Β· 6 β€”
Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 win_net5.0 Microsoft Windows 10.0.26200 X64 .NET 5.0.16 .NETStandard,Version=v2.0 en-GB 61 βœ“ Β· 5 β€”
Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 win_net6.0 Microsoft Windows 10.0.26200 X64 .NET 6.0.6 .NETStandard,Version=v2.0 en-GB 61 βœ“ Β· 5 β€”
Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 win_net6.0_ar-SA Microsoft Windows 10.0.26200 X64 .NET 6.0.6 .NETStandard,Version=v2.0 ar-SA 61 βœ“ Β· 5 β€”
Windows Β· .NET Core 3.1, .NET 5, 6, 7 Β· x64 win_net7.0 Microsoft Windows 10.0.26200 X64 .NET 7.0.20 .NETStandard,Version=v2.0 en-GB 61 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win32_net8.0 Microsoft Windows 10.0.26200 X86 .NET 8.0.31 .NETCoreApp,Version=v8.0 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win_net8.0 Microsoft Windows 10.0.26200 X64 .NET 8.0.33 .NETCoreApp,Version=v8.0 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win_net8.0_de-DE Microsoft Windows 10.0.26200 X64 .NET 8.0.33 .NETCoreApp,Version=v8.0 de-DE 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win_net9.0 Microsoft Windows 10.0.26200 X64 .NET 9.0.20 .NETCoreApp,Version=v8.0 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win32_net10.0 Microsoft Windows 10.0.26200 X86 .NET 10.0.12 .NETCoreApp,Version=v8.0 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win_net10.0 Microsoft Windows 10.0.26200 X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 en-GB 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win_net10.0_th-TH Microsoft Windows 10.0.26200 X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 th-TH 65 βœ“ Β· 5 β€”
Windows Β· .NET 8, 9, 10 Β· x64, x86 win_net10.0_tr-TR Microsoft Windows 10.0.26200 X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 tr-TR 65 βœ“ Β· 5 β€”
Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 linux_net6.0 Debian GNU/Linux 11 (bullseye) X64 .NET 6.0.36 .NETStandard,Version=v2.0 invariant 61 βœ“ Β· 5 β€”
Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 linux_net8.0 Debian GNU/Linux 12 (bookworm) X64 .NET 8.0.33 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 linux_net9.0 Debian GNU/Linux 12 (bookworm) X64 .NET 9.0.22 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 linux_net10.0 Ubuntu 24.04.5 LTS X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Linux (Debian 11, Debian 12, Ubuntu 24.04) Β· .NET 6, 8, 9, 10 Β· x64 linux_net10.0_tr-TR Ubuntu 24.04.5 LTS X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 tr-TR 65 βœ“ Β· 5 β€”
Alpine 3.24 (musl) Β· .NET 8, 10 Β· x64 alpine_net8.0 Alpine Linux v3.24 X64 .NET 8.0.33 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Alpine 3.24 (musl) Β· .NET 8, 10 Β· x64 alpine_net10.0 Alpine Linux v3.24 X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Linux (Debian 12, Ubuntu 24.04) Β· .NET 8, 10 Β· arm64 arm64_net8.0 Debian GNU/Linux 12 (bookworm) Arm64 .NET 8.0.33 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Linux (Debian 12, Ubuntu 24.04) Β· .NET 8, 10 Β· arm64 arm64_net10.0 Ubuntu 24.04.5 LTS Arm64 .NET 10.0.14 .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
NativeAOT, Ubuntu 24.04 Β· .NET 10 Β· x64 aot_net10.0 Ubuntu 24.04.5 LTS X64 .NET 10.0.12, NativeAOT .NETCoreApp,Version=v8.0 invariant 65 βœ“ Β· 5 β€”
Chroma Cloud, AWS us-east-1 Β· .NET 10 Β· x64 cloud_aws-us-east-1 Chroma Cloud, AWS us-east-1; the client on Microsoft Windows 10.0.26200 X64 .NET 10.0.14 .NETCoreApp,Version=v8.0 en-GB 79 βœ“ Β· 1 ⚠ Β· 2 β€”

Checks

Clients: local server, Chroma Cloud, authentication

Tenants and databases

Manage collections

Add, update, delete data (large writes in batches)

Configure: HNSW, SPANN, embedding function

collections created when missing (lazy and now)

Conditional transactions

Attached functions: inputs

Query and get: l2, cosine, ip

Metadata filtering, array metadata

Full-text search and regex

Collection forking

Schema: sparse vector search, BM25

Search API (basics, filtering, ranking, group by, hybrid, pagination, batch)

Quotas & Limits: the client keeps to them or reports the error of Chroma

OpenTelemetry traces and metrics

Cancellation, timeouts, concurrent calls

Dependency injection

Testcontainers module

Mocks in tests

BM25 vectors computed by the client

Search and filter requests built by the client

embeddings from a generator (the builds for .NET 8 and .NET Framework)