Skip to content

v2.9.1

Choose a tag to compare

@Laurianti Laurianti released this 05 Oct 19:31
· 101 commits to main since this release

Patch release of ChromaDotNet.Client and ChromaDotNet.Client.DependencyInjection. Package validation against 2.9.0 finds no breaking change, and there is no new public API.

dotnet add package ChromaDotNet.Client

Fixed

  • Buckets of db.client.operation.duration: the histogram advises the boundaries of the OpenTelemetry semantic conventions, 0.001 to 10 seconds, which OpenTelemetry 1.10 and later apply. Before, it had the default boundaries, made for milliseconds, and P50, P90 and P99 were always 5 s in the Aspire dashboard. The net8.0 build now takes System.Diagnostics.DiagnosticSource 9.0.20. On the netstandard2.0 build, the one of applications on .NET Core 3.1 to 7, the application adds a view, which the README shows.
  • Chains of filters: a & b & c, or a chain built in a loop, goes as one $and list, as the Python client writes it, for the filters on the metadata, on the documents and in the Search API. Before, a chain of 32 filters threw a JsonException about an object cycle.
  • Very long chains: a single Chroma server turns a list of filters into an SQLite expression as deep as the list; Chroma 1.5.9 answers 500 beyond 987 to 994 filters in one list, and crashes from about 4,400. The client counts that depth, and beyond 900 splits each long list into lists with the same meaning: Chroma 1.0.0, 1.0.21 and 1.5.9 then take 4,000 filters and stay up with more.
  • A null value in AddAsync: it throws an ArgumentException before the request. Chroma 0.x would drop the key without an error, and 1.x rejects the request. In UpdateAsync and UpsertAsync a null deletes the key, as before.

Documentation

  • Known defects of the servers, in docs/COMPATIBILITY.md, each reproduced without the client:
    • $contains reading _ and % as wildcards up to 1.0.12;
    • the text after a NUL character;
    • floats truncated against int metadata, doubles read with an error in the last digit, and embeddings of a cosine collection read back different in the last bit, on 1.x;
    • wrong query results under concurrent writes on 0.4.24 and 0.6.3;
    • the limits of long filters.
  • Chroma Cloud takes at most 8 predicates in a filter, the default quota of a tenant.
  • Null values and Metadata: how to delete a key with a null value, and that a record without keys comes back with Metadata null.

Whole doubles already stored

Whole doubles that an earlier version of the client wrote as 2 instead of 2.0 stay integers in Chroma: on those records LessThan("d", 2.2) does not find d = 2 until they are written again.