Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
da3b212
Rename 'input' parameter to 'query' in NearText and NearVector method…
mpartipilo Jan 14, 2026
6eb7656
Add InternalsVisibleTo for Weaviate.Client.Managed
mpartipilo Jan 14, 2026
66e4a88
Add cancellation token support to various configuration methods
mpartipilo Jan 14, 2026
512c8b3
Refactor Vectorizer methods to use generic type parameters for improv…
mpartipilo Jan 20, 2026
9122f3f
Fix exception type in shard status update test to ArgumentNullException
mpartipilo Jan 20, 2026
ceb1f1c
Object TTL configuration
mpartipilo Jan 21, 2026
bfbb762
Refactor enum serialization attributes to use System.Text.Json
mpartipilo Jan 21, 2026
61613a0
Merge pull request #277 from weaviate/feat/object-ttl
mpartipilo Jan 22, 2026
085dee4
Add StopSequences property to Providers and update generative.proto
mpartipilo Jan 23, 2026
7da03d5
Disable flaky edge case test
mpartipilo Jan 23, 2026
43b1ea4
Add analyzer unit tests with dry-run mode support in CI workflow
mpartipilo Jan 23, 2026
acacdde
Merge pull request #278 from weaviate/chore/update-generative-provider
dirkkul Jan 23, 2026
c7f9a00
Refactor JSON comparison in collection and inverted index config test…
mpartipilo Jan 23, 2026
dd66e72
Merge pull request #279 from weaviate/chore/fix-cve
mpartipilo Jan 23, 2026
d7bdc3c
support new restore statuses
parkerduckworth Jan 26, 2026
786f21b
Merge pull request #280 from weaviate/feature/cancel-restore
parkerduckworth Jan 27, 2026
4bcd20a
fix: Handle IDictionary in BuildBatchProperties for gRPC batch inserts
mpartipilo Feb 5, 2026
f360f8e
refactor: Simplify enumerator retrieval in VectorConfigList and enhan…
mpartipilo Feb 6, 2026
e09ebf9
fix: Add InternalsVisibleTo for Weaviate.Client.Managed to enhance in…
mpartipilo Feb 7, 2026
aaa751c
fix: Add InternalsVisibleTo for Weaviate.Client.Managed.Tests to enha…
mpartipilo Feb 9, 2026
bce2f9a
feat: Add BaseURL to Cohere Reranker config
mpartipilo Feb 26, 2026
a39682a
feat: Add ILoggerFactory-based logging with opt-in request/response t…
mpartipilo Feb 27, 2026
e38d548
feat: Add support for dropping property inverted indices (#283)
mpartipilo Feb 27, 2026
f012f58
fix: Update backup restore test for v1.36.0 behavior change
mpartipilo Feb 27, 2026
74ea1d5
fix: Convert non-float vectors to float32 before gRPC byte serializat…
mpartipilo Mar 1, 2026
62c872c
Merge pull request #295 from weaviate/fix/issue-293-vector-dimension-…
dirkkul Mar 2, 2026
ef705d1
Merge pull request #287 from weaviate/feature/cohere-reranker-base-url
dirkkul Mar 2, 2026
2d2ddf0
Merge pull request #288 from weaviate/feature/drop-property-index
dirkkul Mar 2, 2026
850e92a
feat: Add multi2multivec-weaviate vectorizer support (issue #199)
mpartipilo Feb 27, 2026
78bd2dc
Merge pull request #291 from weaviate/feature/multi2multivec-weaviate
mpartipilo Mar 3, 2026
3f043f5
feat: Add CancelRestore() to support cancelling backup restore operat…
mpartipilo Feb 26, 2026
5d71c74
fix: Update .gitignore to exclude .serena directory and memory files
mpartipilo Feb 26, 2026
ed8bae4
feat: Expose size field on Backup model from create status response (…
mpartipilo Feb 27, 2026
5be9e86
test: Add deserialization tests for Cancelling and Finalizing backup …
mpartipilo Mar 4, 2026
3acee14
Merge pull request #292 from weaviate/feature/cancel-backup-restore
mpartipilo Mar 5, 2026
0c165ca
feat: add HFresh vector index type support (#285)
mpartipilo Feb 26, 2026
c1e8fe4
test: Add MultiVector roundtrip, BQ rejection, and named vector tests…
mpartipilo Mar 4, 2026
82ff2ed
Merge pull request #289 from weaviate/feature/hfresh-vector-index
dirkkul Mar 5, 2026
3725420
feat: Add async replication configuration support (issue #284)
mpartipilo Feb 26, 2026
f305489
test: Add full DTO round-trip and ReplicationConfigUpdate forwarding …
mpartipilo Mar 4, 2026
74503dd
Add Multi2VecGoogleGemini vectorizer configuration
mpartipilo Mar 5, 2026
4a2e9bd
Merge pull request #294 from weaviate/feature/async-replication-config
mpartipilo Mar 5, 2026
c941aac
Address PR review comments
mpartipilo Mar 5, 2026
516c8de
Address all PR review comments for Multi2VecGoogleGemini
mpartipilo Mar 5, 2026
7faab01
Merge pull request #297 from weaviate/feature/multi2vec-google-gemini…
mpartipilo Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@
- Use `ToModel()`/`ToDto()` in `Rest/Dto/Extensions.cs` for mapping

## Enum & Wire Format
- Use `ToEnumMemberString()`/`FromEnumMemberString<T>()` for conveting enums to and from strings
- Use `ToEnumMemberString()`/`FromEnumMemberString<T>()` for converting enums to and from strings
- Always prefer enums for permission actions and resource types
- Stick to .NET defaults for JSON serialization, using JsonStringEnumMemberName on enum values for specifying the string conversion, and System.Text.Json.Serialization.JsonStringEnumConverter on properties and fields to speciy the actual conversion on the properties.

## Testing
- Unit: xUnit, mock HTTP handler for REST
Expand Down
22 changes: 21 additions & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,26 @@ jobs:
dotnet tool restore
dotnet csharpier check ${{ steps.changed-files.outputs.all_changed_files }}

- name: Run analyzer unit tests
run: |
if [[ "${{ needs.setup.outputs.dry-run }}" == "true" ]]; then
echo "🏃 DRY-RUN MODE: Skipping actual test execution"
echo "Would run: dotnet test --no-restore --filter \"FullyQualifiedName~Weaviate.Client.Analyzers.Tests\" --logger \"trx;LogFileName=test-analyzer-results.trx\" --collect:\"XPlat Code Coverage\" --results-directory ./test-results"

# Create dummy test results and coverage files
mkdir -p ./test-results
mkdir -p ./test-results/coverage
echo '<?xml version="1.0" encoding="utf-8"?><coverage line-rate="0.85" branch-rate="0.75"><packages><package name="Weaviate.Client" line-rate="0.85" branch-rate="0.75"><classes></classes></package></packages></coverage>' > ./test-results/coverage/coverage.cobertura.xml
echo '<?xml version="1.0" encoding="utf-8"?><TestRun><ResultSummary outcome="Completed"><Counters total="42" executed="42" passed="42" failed="0" error="0" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="0" notExecuted="0" disconnected="0" warning="0" completed="0" inProgress="0" pending="0" /></ResultSummary></TestRun>' > ./test-results/test-unit-results.trx
else
dotnet test --no-restore \
--filter "FullyQualifiedName~Weaviate.Client.Analyzers.Tests" \
--logger "trx;LogFileName=test-analyzer-results.trx" \
--collect:"XPlat Code Coverage" \
--results-directory ./test-results \
--settings coverlet.runsettings
fi

- name: Run unit tests with coverage (or dry-run)
run: |
if [[ "${{ needs.setup.outputs.dry-run }}" == "true" ]]; then
Expand Down Expand Up @@ -147,7 +167,7 @@ jobs:
strategy:
fail-fast: false
matrix:
version: ["1.31.20", "1.32.17", "1.33.5", "1.34.0"]
version: ["1.32.17", "1.33.5", "1.34.0", "1.35.2", "1.36.0"]
uses: ./.github/workflows/test-on-weaviate-version.yml
secrets: inherit
with:
Expand Down
6 changes: 2 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,5 @@ $RECYCLE.BIN/
# Vim temporary swap files
*.swp

.serena

src/Weaviate.Client.Tests/PublicApiApprovalTests.PublicApi_Should_Not_Change_Unexpectedly.approved.txt
src/Weaviate.Client.Tests/PublicApiApprovalTests.PublicApi_Should_Not_Change_Unexpectedly.received.txt
.serena/
memory/
62 changes: 58 additions & 4 deletions ci/compose.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,30 @@ function exec_dc {
}

function compose_up {
exec_dc up -d --quiet-pull
echo "Pulling Weaviate image ${WEAVIATE_VERSION:-latest}..."
echo "Images to be pulled:"
exec_dc config --images
echo ""

if ! exec_dc pull; then
echo "ERROR: Failed to pull Docker images"
echo "Image pull failed for version ${WEAVIATE_VERSION}"
return 1
fi

echo "Successfully pulled images. Starting containers..."
if ! exec_dc up -d; then
echo "ERROR: Failed to start containers"
echo "Container status:"
docker ps -a
echo ""
echo "Container logs:"
exec_dc logs
return 1
fi

echo "Containers started successfully"
return 0
}

function compose_down {
Expand All @@ -47,6 +70,25 @@ function wait(){
while true; do
# first check if weaviate already responds
if ! curl -s "$1" > /dev/null; then
echo "Weaviate port not responding yet. (waited for ${ALREADY_WAITING}s)"
if [ $ALREADY_WAITING -gt $MAX_WAIT_SECONDS ]; then
echo "======================================"
echo "ERROR: Weaviate did not start up in $MAX_WAIT_SECONDS seconds"
echo "======================================"
echo ""
echo "Docker container status:"
docker ps -a --filter "name=weaviate"
echo ""
echo "Docker compose logs (last 50 lines):"
exec_dc logs --tail=50
echo ""
echo "Checking port accessibility:"
nc -zv localhost 8080 || echo "Port 8080 not accessible"
echo "======================================"
exit 1
fi
sleep 2
(( ALREADY_WAITING+=2 )) || true
continue
fi

Expand All @@ -56,9 +98,21 @@ function wait(){
if [ "$HTTP_STATUS" -eq 200 ]; then
break
else
echo "Weaviate is not up yet. (waited for ${ALREADY_WAITING}s)"
echo "Weaviate responding but not ready yet. HTTP $HTTP_STATUS (waited for ${ALREADY_WAITING}s)"
if [ $ALREADY_WAITING -gt $MAX_WAIT_SECONDS ]; then
echo "Weaviate did not start up in $MAX_WAIT_SECONDS."
echo "======================================"
echo "ERROR: Weaviate did not become ready in $MAX_WAIT_SECONDS seconds"
echo "======================================"
echo ""
echo "Docker container status:"
docker ps -a --filter "name=weaviate"
echo ""
echo "Docker compose logs (last 50 lines):"
exec_dc logs --tail=50
echo ""
echo "Weaviate ready endpoint response:"
curl -v "$1/v1/.well-known/ready" || true
echo "======================================"
exit 1
else
sleep 2
Expand All @@ -68,4 +122,4 @@ function wait(){
done

echo "Weaviate is up and running!"
}
}
6 changes: 3 additions & 3 deletions ci/docker-compose-cluster.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
services:
weaviate-node-1:
image: semitechnologies/weaviate:${WEAVIATE_VERSION}
image: cr.weaviate.io/semitechnologies/weaviate:${WEAVIATE_VERSION}
restart: on-failure:0
ports:
- "8087:8080"
Expand Down Expand Up @@ -32,7 +32,7 @@ services:
- '8080'
- --scheme
- http
image: semitechnologies/weaviate:${WEAVIATE_VERSION}
image: cr.weaviate.io/semitechnologies/weaviate:${WEAVIATE_VERSION}
ports:
- 8088:8080
- "50059:50051"
Expand Down Expand Up @@ -66,7 +66,7 @@ services:
- '8080'
- --scheme
- http
image: semitechnologies/weaviate:${WEAVIATE_VERSION}
image: cr.weaviate.io/semitechnologies/weaviate:${WEAVIATE_VERSION}
ports:
- 8089:8080
- "50060:50051"
Expand Down
2 changes: 1 addition & 1 deletion ci/docker-compose-okta-cc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ services:
- --scheme
- http
- --write-timeout=600s
image: semitechnologies/weaviate:${WEAVIATE_VERSION}
image: cr.weaviate.io/semitechnologies/weaviate:${WEAVIATE_VERSION}
ports:
- 8082:8082
restart: on-failure:0
Expand Down
2 changes: 1 addition & 1 deletion ci/docker-compose-okta-users.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ services:
- --scheme
- http
- --write-timeout=600s
image: semitechnologies/weaviate:${WEAVIATE_VERSION}
image: cr.weaviate.io/semitechnologies/weaviate:${WEAVIATE_VERSION}
ports:
- 8083:8083
restart: on-failure:0
Expand Down
2 changes: 1 addition & 1 deletion ci/docker-compose-rbac.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ services:
- --scheme
- http
- --write-timeout=600s
image: semitechnologies/weaviate:${WEAVIATE_VERSION}
image: cr.weaviate.io/semitechnologies/weaviate:${WEAVIATE_VERSION}
ports:
- 8092:8085
- 50063:50051
Expand Down
1 change: 1 addition & 0 deletions ci/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ services:
AUTOSCHEMA_ENABLED: 'false'
DISABLE_TELEMETRY: 'true'
DISABLE_LAZY_LOAD_SHARDS: 'true'
OBJECTS_TTL_DELETE_SCHEDULE: "@every 1m"
GRPC_MAX_MESSAGE_SIZE: 100000000 # 100mb
#ASYNC_INDEXING: 'true'
TRANSFORMERS_INFERENCE_API: http://transformers:8080
Expand Down
12 changes: 11 additions & 1 deletion ci/start_weaviate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,17 @@ compose_down
rm -rf weaviate-data || true

echo "Run Docker compose (Weaviate $WEAVIATE_VERSION)"
compose_up
if ! compose_up; then
echo "======================================"
echo "ERROR: Failed to start Weaviate with Docker Compose"
echo "Version: $WEAVIATE_VERSION"
echo "======================================"
exit 1
fi

echo "Checking Docker container status after compose up:"
docker ps -a --filter "name=weaviate"
echo ""

echo "Wait until all containers are up"

Expand Down
85 changes: 85 additions & 0 deletions docs/CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Contributing to Weaviate C# Client

This document provides guidelines for contributing to the Weaviate C# client.

## Public API Tracking

This project uses [Microsoft.CodeAnalysis.PublicApiAnalyzers](https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) to track changes to the public API surface. This ensures that breaking changes are intentional and reviewed.

### How It Works

The analyzer tracks public API members in two files located in `src/Weaviate.Client/`:

| File | Purpose |
|------|---------|
| `PublicAPI.Shipped.txt` | APIs that have been released in a published version |
| `PublicAPI.Unshipped.txt` | APIs that are new/changed since the last release |

### When Adding New Public APIs

When you add a new public class, method, property, or other member, you'll see an **RS0016** warning at build time:

```
warning RS0016: Symbol 'YourNewMethod' is not part of the declared public API
```

**To fix this:**

1. Use the IDE quick-fix (lightbulb icon) to add the symbol to `PublicAPI.Unshipped.txt`
2. Or run `dotnet format analyzers --diagnostics RS0016` to auto-fix all missing entries

### When Modifying or Removing Public APIs

If you change or remove a public API member, you'll see an **RS0017** warning:

```
warning RS0017: Symbol 'OldMethod' is part of the declared API, but could not be found
```

This is intentional - it alerts you to a potential **breaking change**. Before proceeding:

1. Consider if the change is backward-compatible
2. If removing/changing is intentional, update the corresponding line in `PublicAPI.Unshipped.txt`
3. Document the breaking change in the changelog

### Release Process

When preparing a release:

1. Review all entries in `PublicAPI.Unshipped.txt`
2. Move the entries to `PublicAPI.Shipped.txt`
3. Clear `PublicAPI.Unshipped.txt` (keeping only `#nullable enable`)

### Suppressed Warnings

The following analyzer warnings are currently suppressed in the project:

| Warning | Reason |
|---------|--------|
| RS0026 | Multiple overloads with optional parameters (API design advisory) |
| RS0027 | Optional parameter ordering (API design advisory) |
| RS0041 | Oblivious reference types (nullability advisory) |

These are design recommendations, not API tracking issues. They may be addressed in future refactoring efforts.

## Building the Project

```bash
# Build the main library
dotnet build src/Weaviate.Client/Weaviate.Client.csproj

# Build and run tests
dotnet test src/Weaviate.Client.Tests/Weaviate.Client.Tests.csproj
```

## Running Tests

The test project includes both unit tests and integration tests. Integration tests require a running Weaviate instance.

```bash
# Run all tests
dotnet test

# Run only unit tests
dotnet test --filter "Category!=Integration"
```
36 changes: 18 additions & 18 deletions docs/PROPERTY_SYSTEM.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,55 +58,55 @@ The `DataType` enum defines all supported Weaviate data types with `[EnumMember]
```csharp
public enum DataType
{
[System.Runtime.Serialization.EnumMember(Value = "unknown")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("unknown")]
Unknown,

// Text types
[System.Runtime.Serialization.EnumMember(Value = "text")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("text")]
Text,
[System.Runtime.Serialization.EnumMember(Value = "text[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("text[]")]
TextArray,

// Numeric types
[System.Runtime.Serialization.EnumMember(Value = "int")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("int")]
Int,
[System.Runtime.Serialization.EnumMember(Value = "int[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("int[]")]
IntArray,
[System.Runtime.Serialization.EnumMember(Value = "number")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("number")]
Number,
[System.Runtime.Serialization.EnumMember(Value = "number[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("number[]")]
NumberArray,

// Boolean types
[System.Runtime.Serialization.EnumMember(Value = "boolean")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("boolean")]
Bool,
[System.Runtime.Serialization.EnumMember(Value = "boolean[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("boolean[]")]
BoolArray,

// Date types
[System.Runtime.Serialization.EnumMember(Value = "date")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("date")]
Date,
[System.Runtime.Serialization.EnumMember(Value = "date[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("date[]")]
DateArray,

// UUID types
[System.Runtime.Serialization.EnumMember(Value = "uuid")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("uuid")]
Uuid,
[System.Runtime.Serialization.EnumMember(Value = "uuid[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("uuid[]")]
UuidArray,

// Special types
[System.Runtime.Serialization.EnumMember(Value = "geoCoordinates")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("geoCoordinates")]
GeoCoordinate,
[System.Runtime.Serialization.EnumMember(Value = "blob")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("blob")]
Blob,
[System.Runtime.Serialization.EnumMember(Value = "phoneNumber")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("phoneNumber")]
PhoneNumber,

// Object types
[System.Runtime.Serialization.EnumMember(Value = "object")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("object")]
Object,
[System.Runtime.Serialization.EnumMember(Value = "object[]")]
[System.Text.Json.Serialization.JsonStringEnumMemberName("object[]")]
ObjectArray
}
```
Expand Down
2 changes: 1 addition & 1 deletion docs/VECTOR_API_OVERVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ Task<GroupByResult> NearText(

// Extension: NearTextInput record
Task<WeaviateResult> NearText(
NearTextInput input,
NearTextInput query,
...
)
```
Expand Down
Loading