ChromaDotNet.Client conformance: Chroma single server and Chroma Cloud
- Client: ChromaDotNet.Client 2.20.0
- Chroma:
chromadb/chroma:1.5.9, a single server in Docker - Chroma Cloud: AWS us-east-1, run on 2026-11-06 with the client 2.20.0 on .NET 10.0.14; every collection and database deleted at the end
- OpenTelemetry SDK: 1.19.1; ChromaDotNet.Testcontainers: 0.1.7 (Testcontainers 4.15.0)
- Chroma image digest: chromadb/chroma@sha256:1e0b73a187a28757c572acba508c46f48c9e8b0acaf5c20e6d95cdedce1acdf6
- Docker: 29.7.2 (linux/amd64)
- .NET SDK: 10.0.401
- Host: Windows 10.0.26200, x86_64
- Client package: the packages of nuget.org (same SHA-512): ChromaDotNet.Client 3eVE8ZPHUNjlcat/jErqGkTnhiRT2BOOpvQahVGth3vHjn352UVCDKHsJHt6I84FewIyg1SkRlAT1LhAXtUkSg==, ChromaDotNet.Client.DependencyInjection hrMw1RAqdMfI+0XuBAGTk3y48j3bihwR58O5+LflXKtzNnwQTLHwsKG6piJ2WI+daT0BsEVumlV42X5o3SBt7A==
- Arm64: the Linux arm64 images of .NET, emulated by Docker on this x86-64 host
- Environments: 31, 2154 checks run
- Generated: 2026-11-06 22:19 UTC
β 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
- β the address alone, with /api/v2 and with /api/v2/
- β constructors: uri, options, options and HttpClient
- β connection strings
- β Chroma Cloud at another address: WithChromaCloud
- β version, heartbeat, healthcheck, pre-flight checks, identity
- β authentication headers: X-Chroma-Token, Bearer, Basic
- β the v1 API on Chroma 1.x answers 410 Gone
- β errors: status, error type, CollectionExistsAsync
- β writes refused for compaction go again (429 of the log)
- β the option of distributed Chroma (WithDistributedChroma, Distributed=)
- β the server block of pre-flight-checks
- β sparse vector index support (SupportsSparseVectorIndexes)
- β the DistributedChroma option
Tenants and databases
- β create and get a tenant; β on cloud_aws-us-east-1: an API key of Chroma Cloud cannot create a tenant: Chroma Cloud answers 403 "Permission denied.", which the client throws as a ChromaException
- β databases: create, get, list with paging, delete
- β collections in another tenant and database; β on cloud_aws-us-east-1: 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
Manage collections
- β create, get, get or create, exists, delete
- β list with paging, count
- β modify name and metadata
- β by id, collection clients, dimension, version
- β names and metadata the client stops: dots, lists, lone surrogates
- β deleteRecordsFirst when the records stay after their delete: an error, the collection kept
Add, update, delete data (large writes in batches)
- β add and read back embeddings, metadata, documents, URIs
- β metadata without keys: no metadata; a mixed list: stopped; a record without keys reads back empty
- β a write that fails after some of its batches: how many records went, not run again
- β update, upsert, null deletes a key
- β 12,000 records: written in batches, read in pages
- β batches: one request, and a smaller size
- β delete: by ids, by filters, with a limit
- β count at a read level
Configure: HNSW, SPANN, embedding function
- β space: l2, cosine, inner product
- β HNSW settings, changed after the creation
- β SPANN on a single server: the client tells
- β embedding function declared
- β schema: value indexes off, full-text search off, space
- β index settings, changed after the creation: SPANN on Chroma Cloud
- β the index Chroma Cloud does not use: HNSW, the client tells
collections created when missing (lazy and now)
- β lazy: no request until the first operation, which creates the collection
- β lazy: first operations at the same time share one request
- β now: GetOrCreateCollectionClientAsync creates it at once, and keeps an existing one
- β with a definition: the metadata and the space of the definition
- β deleted elsewhere: the next operation creates it again, empty, with the definition, once
- β createIfMissing: false never creates the collection
Conditional transactions
- β begin, get, write and commit; a conflict; RunConditionalTransactionAsync again; β 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: 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
Attached functions: inputs
- β another input (AddFunctionInputAsync); β 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: 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 cloud_aws-us-east-1: Chroma Cloud answers 429 "Too many requests; backoff and try again" to the attach of a function, so the input is not reached
Query and get: l2, cosine, ip
- β nearest records and distances, in each space
- β several queries, ids, filters, include, ChromaQuery
- β get: one, many, missing, limit and offset, include
- β floats the server cannot write: read as NaN or infinity, the other records intact
Metadata filtering, array metadata
- β every operator on ints, floats, strings, bools
- β & and |, nested, long chains
- β a condition on the ids with a repeated id: each id sent once
- β lists in metadata: $contains, $not_contains
- β metadata values read exactly, or inferred
Full-text search and regex
- β $contains, $not_contains, combined
- β $regex, $not_regex
Collection forking
- β ForkAsync and ForkCountAsync; β 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: distributed Chroma, the one Chroma Cloud runs on, has fork; a single server answers 501, which the client throws as a ChromaException
Schema: sparse vector search, BM25
- β a sparse vector index in the schema: Chroma docs: sparse vector search is in the Chroma Cloud section; a single server answers 400, which the client throws as a ChromaException
- β a sparse vector index with BM25: written, read back, searched
Search API (basics, filtering, ranking, group by, hybrid, pagination, batch)
- β SearchAsync: distributed Chroma, the one Chroma Cloud runs on, has the Search API; a single server answers 501, which the client throws as a ChromaException
- β basics: knn, limit, select
- β filtering: where, where_document, ids
- β ranking: sums and products of rankings
- β group by: the nearest of each category
- β hybrid: RRF of a dense and a BM25 ranking
- β pagination: limit and offset
- β batch: several searches in one request
Quotas & Limits: the client keeps to them or reports the error of Chroma
- β 300 records per write: the client splits; one request beyond gets the error
- β 300 results: a get reads beyond in pages; a query or search beyond
- β 10 reads or writes at a time per collection: 30 at once
- β 8 predicates per filter
- β 256 characters in a full-text search or a regex
- β 4,096 dimensions
- β 16,384 bytes per document
- β 128 bytes per id, collection name and database name
- β 8,182 bytes per metadata value
- β 32 metadata keys
OpenTelemetry traces and metrics
- β a span for each operation, with the attributes of the conventions
- β the duration histogram and its buckets, with the OpenTelemetry SDK; β on win_netcoreapp3.1, win_netcoreapp3.1_ja-JP: the OpenTelemetry SDK exports no metric on this runtime, also from a meter of its own
Cancellation, timeouts, concurrent calls
- β a canceled token, a timeout
- β tasks at the same time on one client: 24, or 10 on Chroma Cloud
Dependency injection
- β AddChromaClient, AddKeyedChromaClient, CreateChromaClient
Testcontainers module
- β a Chroma container from ChromaDotNet.Testcontainers
Mocks in tests
- β a subclass without a server
BM25 vectors computed by the client
- β the vectors of the Python client of Chroma for 216 texts
Search and filter requests built by the client
- β the JSON of ranks and filters
embeddings from a generator (the builds for .NET 8 and .NET Framework)
- β add, update and upsert with documents only: the embeddings of the generator
- β query by text: the records of the query by its embedding
- β the With methods of the collection client keep the generator
- β a new collection with the generator of Chroma declares the function default