Skip to content

Add Multi2VecGoogleGemini vectorizer configuration#297

Merged
mpartipilo merged 5 commits intov1.0.1from
feature/multi2vec-google-gemini-api-endpoint
Mar 5, 2026
Merged

Add Multi2VecGoogleGemini vectorizer configuration#297
mpartipilo merged 5 commits intov1.0.1from
feature/multi2vec-google-gemini-api-endpoint

Conversation

@mpartipilo
Copy link
Collaborator

Description

This PR adds support for the multi2vec-google-gemini vectorizer configuration, enabling the use of Google's Gemini API for multi-modal embeddings.

Changes

  • Added Multi2VecGoogleGemini class in Vectorizer.cs

    • Includes ApiEndpoint property (defaults to generativelanguage.googleapis.com)
    • Does NOT require ProjectId or Location (unlike Multi2VecGoogle which is for Vertex AI)
    • Supports image, text, and video fields with optional weights
    • Supports dimensions, modelId, videoIntervalSeconds, and vectorizeCollectionName
  • Added factory methods in VectorizerFactory.cs

    • Two overloads: one with WeightedFields and one with string arrays
    • Properly sets the default API endpoint

Differences from Multi2VecGoogle

Feature Multi2VecGoogle (Vertex AI) Multi2VecGoogleGemini (Gemini API)
Wire Format multi2vec-palm multi2vec-google-gemini
API Endpoint Uses Vertex AI generativelanguage.googleapis.com
ProjectId Required Not required
Location Required Not required
Media Fields ✅ Image, Text, Video ✅ Image, Text, Video

Testing

  • ✅ Build passes successfully
  • ✅ Code follows existing patterns (modeled after Text2VecGoogle)

Closes #296

g-despot and others added 3 commits January 27, 2026 08:34
- Added Multi2VecGoogleGemini class with apiEndpoint support
- ApiEndpoint defaults to generativelanguage.googleapis.com
- Does not require location and project_id (unlike Multi2VecGoogle for Vertex AI)
- Added factory methods for Multi2VecGoogleGemini configuration
- Supports image, text, and video fields with optional weights

Fixes #296
@mpartipilo mpartipilo requested a review from Copilot March 5, 2026 15:05
Copy link

@orca-security-eu orca-security-eu bot left a comment

Choose a reason for hiding this comment

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

Orca Security Scan Summary

Status Check Issues by priority
Passed Passed Infrastructure as Code high 0   medium 0   low 0   info 0 View in Orca
Passed Passed SAST high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Secrets high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Vulnerabilities high 0   medium 0   low 0   info 0 View in Orca

@mpartipilo mpartipilo requested a review from antas-marcin March 5, 2026 15:05
@mpartipilo mpartipilo changed the base branch from main to v1.0.1 March 5, 2026 15:05
TextFields = textFields,
VideoFields = videoFields,
VideoIntervalSeconds = videoIntervalSeconds,
ModelId = model,

Choose a reason for hiding this comment

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

let's use model like in all other modules. I have added support for that field name with a fallback to modeld

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes, the argument is already called model, the property should follow. It's still serialized to JSON as modelId.

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

Summary - Weaviate C# Client Coverage

Summary
Generated on: 03/05/2026 - 19:43:22
Coverage date: 03/05/2026 - 18:41:55 - 03/05/2026 - 19:42:32
Parser: MultiReport (68x Cobertura)
Assemblies: 2
Classes: 327
Files: 209
Line coverage: 62.7% (12745 of 20323)
Covered lines: 12745
Uncovered lines: 7578
Coverable lines: 20323
Total lines: 53593
Branch coverage: 53.8% (2997 of 5561)
Covered branches: 2997
Total branches: 5561
Method coverage: Feature is only available for sponsors

Coverage

Weaviate.Client - 61.3%
Name Line Branch
Weaviate.Client 61.3% 52.8%
Weaviate.Client.AggregateClient 51.3% 31.8%
Weaviate.Client.AggregateClientHybridExtensions 0%
Weaviate.Client.AliasClient 100% 62.5%
Weaviate.Client.ApiKeyTokenService 100% 50%
Weaviate.Client.Auth 9.5%
Weaviate.Client.AuthenticatedHttpHandler 71.7% 60%
Weaviate.Client.BackupClient 87.2% 45.6%
Weaviate.Client.BaseCollectionClient 0% 0%
Weaviate.Client.Cache.SchemaCache 69.4% 60%
Weaviate.Client.ClientConfiguration 100% 100%
Weaviate.Client.ClusterClient 86.2% 64.2%
Weaviate.Client.CollectionClient 98.7% 87.5%
Weaviate.Client.CollectionClientExtensions 100% 100%
Weaviate.Client.CollectionConfigClient 95.1% 58.3%
Weaviate.Client.CollectionsClient 32.3% 35%
Weaviate.Client.Configure 65.7% 65.7%
Weaviate.Client.Connect 25.5% 0%
Weaviate.Client.DataClient 91.4% 79.6%
Weaviate.Client.DefaultTokenServiceFactory 5.7% 6.8%
Weaviate.Client.DependencyInjection.WeaviateClientFactory 0% 0%
Weaviate.Client.DependencyInjection.WeaviateInitializationService 0%
Weaviate.Client.DependencyInjection.WeaviateOptions 0%
Weaviate.Client.DependencyInjection.WeaviateServiceCollectionExtensions 0% 0%
Weaviate.Client.Factory 100%
Weaviate.Client.Generate 100%
Weaviate.Client.GenerateClient 38.4% 45.6%
Weaviate.Client.GenerateClientHybridExtensions 48.8%
Weaviate.Client.GenerativeConfigFactory 5.2% 100%
Weaviate.Client.GenerativeProviderFactory 1%
Weaviate.Client.GroupsClient 100%
Weaviate.Client.GroupsOidcClient 47.8%
Weaviate.Client.Grpc.LoggingInterceptor 93% 100%
Weaviate.Client.Grpc.RetryInterceptor 41.6% 37.5%
Weaviate.Client.Grpc.WeaviateGrpcClient 76.7% 61.9%
Weaviate.Client.Grpc.WeaviateGrpcServerException 0%
Weaviate.Client.Internal.AutoArray`1 100% 100%
Weaviate.Client.Internal.AutoArrayBuilder 100% 100%
Weaviate.Client.Internal.ExceptionHelper 89.6% 86.5%
Weaviate.Client.Internal.HttpLoggingHandler 75% 87.5%
Weaviate.Client.Internal.KeySortedList`2 43.7%
Weaviate.Client.Internal.MultiKeySortedList`2 85.3% 87.5%
Weaviate.Client.Internal.ObjectHelper 51.2% 36.4%
Weaviate.Client.Internal.RetryHandler 98.1% 83.3%
Weaviate.Client.Internal.TimeoutHelper 100% 100%
Weaviate.Client.Internal.VersionGuard 100% 75%
Weaviate.Client.Models.Aggregate 100%
Weaviate.Client.Models.AggregateGroupByResult 42.2% 19.8%
Weaviate.Client.Models.AggregateResult 92.6% 69.7%
Weaviate.Client.Models.Alias 100%
Weaviate.Client.Models.AliasesResource 100%
Weaviate.Client.Models.AndNestedFilter 50%
Weaviate.Client.Models.Backup 63.6%
Weaviate.Client.Models.BackupBackend 40%
Weaviate.Client.Models.BackupClientConfig 100%
Weaviate.Client.Models.BackupCreateOperation 100%
Weaviate.Client.Models.BackupCreateRequest 100%
Weaviate.Client.Models.BackupOperationBase 66.1% 65.3%
Weaviate.Client.Models.BackupRestoreOperation 100%
Weaviate.Client.Models.BackupRestoreRequest 100%
Weaviate.Client.Models.BackupsResource 100%
Weaviate.Client.Models.BackupStatusExtensions 85.7% 52.5%
Weaviate.Client.Models.BatchInsertRequest 52.1%
Weaviate.Client.Models.BatchInsertResponse 80%
Weaviate.Client.Models.BatchInsertResponseEntry 100%
Weaviate.Client.Models.BatchReferenceReturn 29% 0%
Weaviate.Client.Models.BM25Config 66.6% 83.3%
Weaviate.Client.Models.Bm25ConfigUpdate 60% 50%
Weaviate.Client.Models.BM25Operator 66.6%
Weaviate.Client.Models.ClusterNode 38.4%
Weaviate.Client.Models.ClusterNodeVerbose 23% 0%
Weaviate.Client.Models.CollectionConfig 91.3% 57.1%
Weaviate.Client.Models.CollectionConfigCommon 85.8% 57.1%
Weaviate.Client.Models.CollectionConfigExport 100% 100%
Weaviate.Client.Models.CollectionsResource 100%
Weaviate.Client.Models.CollectionUpdate 42.2% 50%
Weaviate.Client.Models.CurrentUserInfo 80%
Weaviate.Client.Models.DatabaseUser 66.6%
Weaviate.Client.Models.DataReference 100%
Weaviate.Client.Models.DataResource 100%
Weaviate.Client.Models.DataTypeExtensions 0% 0%
Weaviate.Client.Models.DeleteManyObjectResult 100%
Weaviate.Client.Models.DeleteManyResult 100%
Weaviate.Client.Models.DynamicDto 0%
Weaviate.Client.Models.EmptyBackend 33.3%
Weaviate.Client.Models.EmptyStringEnumConverter`1 86.9% 66.6%
Weaviate.Client.Models.FilesystemBackend 100%
Weaviate.Client.Models.Filter 61.9% 40%
Weaviate.Client.Models.Filter`1 50% 50%
Weaviate.Client.Models.FlatDto 100%
Weaviate.Client.Models.FlexibleConverter`1 11.3% 3.4%
Weaviate.Client.Models.FlexibleStringConverter 38.4% 25%
Weaviate.Client.Models.Generative.Providers 27.8%
Weaviate.Client.Models.GenerativeConfig 7.5%
Weaviate.Client.Models.GenerativeConfigSerialization 46.8% 55.4%
Weaviate.Client.Models.GenerativeDebug 0%
Weaviate.Client.Models.GenerativeGroupByObject 100%
Weaviate.Client.Models.GenerativeGroupByResult 100%
Weaviate.Client.Models.GenerativePrompt 100%
Weaviate.Client.Models.GenerativeProvider 83.3%
Weaviate.Client.Models.GenerativeReply 100%
Weaviate.Client.Models.GenerativeResult 20% 0%
Weaviate.Client.Models.GenerativeWeaviateGroup 100%
Weaviate.Client.Models.GenerativeWeaviateObject 100%
Weaviate.Client.Models.GenerativeWeaviateResult 100%
Weaviate.Client.Models.GeoCoordinate 100%
Weaviate.Client.Models.GeoCoordinateConstraint 0%
Weaviate.Client.Models.GroupByObject 100%
Weaviate.Client.Models.GroupByRequest 100%
Weaviate.Client.Models.GroupByResult 100%
Weaviate.Client.Models.GroupByResult`2 100%
Weaviate.Client.Models.GroupedTask 100%
Weaviate.Client.Models.GroupRoleAssignment 0%
Weaviate.Client.Models.GroupsResource 100%
Weaviate.Client.Models.HFreshDto 100%
Weaviate.Client.Models.HnswDto 100%
Weaviate.Client.Models.HybridNearTextBuilder 68.8%
Weaviate.Client.Models.HybridNearVectorBuilder 60.9%
Weaviate.Client.Models.HybridVectorInput 91% 85.7%
Weaviate.Client.Models.HybridVectorInputBuilder 100%
Weaviate.Client.Models.InvertedIndexConfig 69% 72.7%
Weaviate.Client.Models.InvertedIndexConfigUpdate 80% 50%
Weaviate.Client.Models.JsonConverterEmptyCollectionAsNull 73.6% 50%
Weaviate.Client.Models.Metadata 100%
Weaviate.Client.Models.MetadataQuery 80.9%
Weaviate.Client.Models.MetaInfo 90.9% 50%
Weaviate.Client.Models.Metrics 84.8% 60%
Weaviate.Client.Models.ModelsToDtoExtensions 100% 85%
Weaviate.Client.Models.ModuleConfigList 16.6% 7.1%
Weaviate.Client.Models.Move 100%
Weaviate.Client.Models.MultiTenancyConfig 100%
Weaviate.Client.Models.MultiTenancyConfigUpdate 60%
Weaviate.Client.Models.MultiVectorDto 100%
Weaviate.Client.Models.MultiVectorEncodingDto 100%
Weaviate.Client.Models.MuveraDto 100% 100%
Weaviate.Client.Models.NamedVector 100% 100%
Weaviate.Client.Models.NearTextBuilder 100%
Weaviate.Client.Models.NearTextInput 100%
Weaviate.Client.Models.NearVectorBuilder 100%
Weaviate.Client.Models.NearVectorInput 54.5%
Weaviate.Client.Models.NestedFilter 100%
Weaviate.Client.Models.NodesResource 100%
Weaviate.Client.Models.NodeStatusExtensions 60% 20%
Weaviate.Client.Models.NotNestedFilter 100%
Weaviate.Client.Models.ObjectReference 80%
Weaviate.Client.Models.ObjectStorageBackend 100%
Weaviate.Client.Models.ObjectTTLConfig 97%
Weaviate.Client.Models.ObjectTTLConfigUpdate 89.6% 26.9%
Weaviate.Client.Models.OrNestedFilter 100%
Weaviate.Client.Models.PermissionResourceExtensions 78.9% 33.3%
Weaviate.Client.Models.Permissions 66.5% 50%
Weaviate.Client.Models.PermissionScope 100%
Weaviate.Client.Models.PhoneNumber 88.8%
Weaviate.Client.Models.Property 98.4% 79.6%
Weaviate.Client.Models.Property`1 100%
Weaviate.Client.Models.PropertyFilter 81.3% 75%
Weaviate.Client.Models.PropertyHelper 69.8% 56.9%
Weaviate.Client.Models.PropertyIndexTypeExtensions 87.5% 75%
Weaviate.Client.Models.PropertyUpdate 25%
Weaviate.Client.Models.QueryReference 100%
Weaviate.Client.Models.Reference 100%
Weaviate.Client.Models.ReferenceFilter 100%
Weaviate.Client.Models.ReferenceUpdate 0%
Weaviate.Client.Models.ReplicateRequest 100%
Weaviate.Client.Models.ReplicateResource 100%
Weaviate.Client.Models.ReplicationAsyncConfig 100%
Weaviate.Client.Models.ReplicationClientConfig 100%
Weaviate.Client.Models.ReplicationConfig 100%
Weaviate.Client.Models.ReplicationConfigUpdate 66.6%
Weaviate.Client.Models.ReplicationOperation 65% 50%
Weaviate.Client.Models.ReplicationOperationError 0%
Weaviate.Client.Models.ReplicationOperationStatus 37.5% 0%
Weaviate.Client.Models.ReplicationOperationTracker 64% 54.5%
Weaviate.Client.Models.Rerank 100%
Weaviate.Client.Models.Reranker 26.9%
Weaviate.Client.Models.RerankerConfigSerialization 56.8% 55%
Weaviate.Client.Models.RoleInfo 100%
Weaviate.Client.Models.RolesResource 100%
Weaviate.Client.Models.ShardInfo 100%
Weaviate.Client.Models.ShardingConfig 100%
Weaviate.Client.Models.ShardStatusExtensions 100% 50%
Weaviate.Client.Models.SimpleTargetVectors 100%
Weaviate.Client.Models.SinglePrompt 100%
Weaviate.Client.Models.Sort 100% 50%
Weaviate.Client.Models.SortExtensions 100%
Weaviate.Client.Models.StopwordConfig 66.6% 75%
Weaviate.Client.Models.StopwordsConfigUpdate 57.1% 50%
Weaviate.Client.Models.TargetVectors 75.5% 0%
Weaviate.Client.Models.Tenant 38.8% 13.3%
Weaviate.Client.Models.TenantsResource 100%
Weaviate.Client.Models.TimeFilter 75% 25%
Weaviate.Client.Models.Typed.AggregateGroupByResult`1 100% 100%
Weaviate.Client.Models.Typed.AggregatePropertyMapper 84.8% 61.7%
Weaviate.Client.Models.Typed.AggregateResult`1 100%
Weaviate.Client.Models.Typed.BooleanMetricsAttribute 100%
Weaviate.Client.Models.Typed.DateMetricsAttribute 100%
Weaviate.Client.Models.Typed.GenerativeGroupByObject`1 0%
Weaviate.Client.Models.Typed.GenerativeGroupByResult`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateGroup`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateObject`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateResult`1 0%
Weaviate.Client.Models.Typed.GroupByObject`1 0%
Weaviate.Client.Models.Typed.GroupByResult`1 0%
Weaviate.Client.Models.Typed.IntegerMetricsAttribute 100%
Weaviate.Client.Models.Typed.MetricsExtractor 81.5% 79.8%
Weaviate.Client.Models.Typed.NumberMetricsAttribute 100%
Weaviate.Client.Models.Typed.TextMetricsAttribute 100%
Weaviate.Client.Models.Typed.TypedResultConverter 20% 7.6%
Weaviate.Client.Models.Typed.WeaviateGroup`2 0%
Weaviate.Client.Models.Typed.WeaviateObject`1 47.3% 37.5%
Weaviate.Client.Models.TypedBase`1 70.5%
Weaviate.Client.Models.TypedGuid 66.6%
Weaviate.Client.Models.TypedValue`1 80%
Weaviate.Client.Models.User 0%
Weaviate.Client.Models.UserMetadata 0%
Weaviate.Client.Models.UserRoleAssignment 100%
Weaviate.Client.Models.UsersResource 100%
Weaviate.Client.Models.Vector 46.8% 28.1%
Weaviate.Client.Models.VectorBuilder 30% 27.7%
Weaviate.Client.Models.VectorConfig 82.7% 50%
Weaviate.Client.Models.VectorConfigList 59.3% 60%
Weaviate.Client.Models.VectorConfigUpdate 50%
Weaviate.Client.Models.VectorIndex 88.2%
Weaviate.Client.Models.VectorIndexConfig 100%
Weaviate.Client.Models.VectorIndexConfigUpdate 68.4% 33.3%
Weaviate.Client.Models.VectorIndexConfigUpdateDynamic 0% 0%
Weaviate.Client.Models.VectorIndexConfigUpdateFlat 40%
Weaviate.Client.Models.VectorIndexConfigUpdateHNSW 52.9%
Weaviate.Client.Models.VectorIndexMappingExtensions 90% 77.2%
Weaviate.Client.Models.VectorIndexSerialization 62.6% 44.1%
Weaviate.Client.Models.VectorInputBuilderFactories 100% 100%
Weaviate.Client.Models.Vectorizer 12% 0%
Weaviate.Client.Models.VectorizerAttribute 100%
Weaviate.Client.Models.VectorizerConfig 64.1% 56.2%
Weaviate.Client.Models.VectorizerRegistry 68.9% 71.4%
Weaviate.Client.Models.Vectorizers.VectorizerConfigFactory 58% 62.5%
Weaviate.Client.Models.VectorMulti`1 40.7% 23%
Weaviate.Client.Models.VectorQuery 45% 50%
Weaviate.Client.Models.Vectors 37.5% 100%
Weaviate.Client.Models.VectorSearchInput 86.3% 16.6%
Weaviate.Client.Models.VectorSingle`1 22.7% 0%
Weaviate.Client.Models.WeaviateGroup`1 80%
Weaviate.Client.Models.WeaviateObject 88.8%
Weaviate.Client.Models.WeaviateObjectExtensions 95.6% 75%
Weaviate.Client.Models.WeaviateResult 100%
Weaviate.Client.Models.WeaviateResult`1 100%
Weaviate.Client.Models.WeightedField 0%
Weaviate.Client.Models.WeightedFields 0% 0%
Weaviate.Client.Models.WeightedTargetVectors 100% 100%
Weaviate.Client.NearMediaBuilder 95.2% 50%
Weaviate.Client.NearMediaInput 100%
Weaviate.Client.NodesClient 87.5% 50%
Weaviate.Client.OAuthConfig 0%
Weaviate.Client.OAuthTokenService 0% 0%
Weaviate.Client.QueryClient 67.3% 55%
Weaviate.Client.QueryClientHybridExtensions 48.8% 25%
Weaviate.Client.QueryClientNearTextExtensions 74.2% 75%
Weaviate.Client.ReplicationsClient 87% 51.7%
Weaviate.Client.RequiresWeaviateVersionAttribute 100%
Weaviate.Client.RerankerConfigFactory 21.4% 100%
Weaviate.Client.Rest.EnumMemberJsonConverter`1 0% 0%
Weaviate.Client.Rest.EnumMemberJsonConverterFactory 0%
Weaviate.Client.Rest.HttpResponseMessageExtensions 90.2% 62.5%
Weaviate.Client.Rest.InvalidEnumWireFormatException 0%
Weaviate.Client.Rest.WeaviateEndpoints 85.4% 84.4%
Weaviate.Client.Rest.WeaviateRestClient 89.7% 53.3%
Weaviate.Client.Rest.WeaviateRestClientException 50% 25%
Weaviate.Client.Rest.WeaviateRestServerException 0% 0%
Weaviate.Client.Rest.WeaviateUnexpectedStatusCodeException 100%
Weaviate.Client.RetryPolicy 81.2% 50%
Weaviate.Client.RolesClient 90.3% 50%
Weaviate.Client.Serialization.Converters.BlobPropertyConverter 58.8% 37.5%
Weaviate.Client.Serialization.Converters.BoolPropertyConverter 80% 50%
Weaviate.Client.Serialization.Converters.DatePropertyConverter 51.3% 36.8%
Weaviate.Client.Serialization.Converters.GeoPropertyConverter 52.2% 23.6%
Weaviate.Client.Serialization.Converters.IntPropertyConverter 66.6% 50%
Weaviate.Client.Serialization.Converters.NumberPropertyConverter 64.7% 47%
Weaviate.Client.Serialization.Converters.ObjectPropertyConverter 18% 7.3%
Weaviate.Client.Serialization.Converters.PhonePropertyConverter 51.8% 33.3%
Weaviate.Client.Serialization.Converters.TextPropertyConverter 75% 75%
Weaviate.Client.Serialization.Converters.UuidPropertyConverter 61.1% 37.5%
Weaviate.Client.Serialization.PropertyBag 28.9% 20.7%
Weaviate.Client.Serialization.PropertyConverterBase 65.3% 50%
Weaviate.Client.Serialization.PropertyConverterRegistry 78.1% 70.1%
Weaviate.Client.TenantsClient 84.5% 37.5%
Weaviate.Client.Typed.TypedCollectionClient`1 95.5% 50%
Weaviate.Client.Typed.TypedDataClient`1 49%
Weaviate.Client.Typed.TypedGenerateClient`1 0.8% 0%
Weaviate.Client.Typed.TypedGenerateClientHybridExtensions 0%
Weaviate.Client.Typed.TypedQueryClient`1 10.6% 100%
Weaviate.Client.Typed.TypedQueryClientHybridExtensions 0%
Weaviate.Client.UsersClient 89.4% 66.6%
Weaviate.Client.UsersDatabaseClient 100% 62.5%
Weaviate.Client.UsersOidcClient 4.5%
Weaviate.Client.Validation.TypeValidationException 55.5%
Weaviate.Client.Validation.TypeValidator 75.7% 75%
Weaviate.Client.Validation.ValidationError 83.3%
Weaviate.Client.Validation.ValidationResult 100% 100%
Weaviate.Client.Validation.ValidationWarning 75%
Weaviate.Client.ValidationExtensions 80% 100%
Weaviate.Client.VectorizerFactory 5.7% 0%
Weaviate.Client.VectorizerFactoryMulti 25%
Weaviate.Client.WeaviateAuthenticationException 100% 100%
Weaviate.Client.WeaviateAuthorizationException 100% 100%
Weaviate.Client.WeaviateBackupConflictException 100%
Weaviate.Client.WeaviateBadRequestException 100% 100%
Weaviate.Client.WeaviateClient 75.8% 55.7%
Weaviate.Client.WeaviateClientBuilder 57.7% 53.8%
Weaviate.Client.WeaviateClientBuilderExtensions 0%
Weaviate.Client.WeaviateClientException 66.6%
Weaviate.Client.WeaviateCollectionLimitReachedException 100% 100%
Weaviate.Client.WeaviateConflictException 100%
Weaviate.Client.WeaviateDefaults 100%
Weaviate.Client.WeaviateException 66.6%
Weaviate.Client.WeaviateExtensions 79.3% 56.4%
Weaviate.Client.WeaviateExternalModuleProblemException 100% 100%
Weaviate.Client.WeaviateFeatureNotSupportedException 100% 100%
Weaviate.Client.WeaviateModuleNotAvailableException 100% 100%
Weaviate.Client.WeaviateNotFoundException 14.8% 0%
Weaviate.Client.WeaviateServerException 66.6%
Weaviate.Client.WeaviateTimeoutException 100% 100%
Weaviate.Client.WeaviateUnprocessableEntityException 100% 100%
Weaviate.Client.WeaviateVersionMismatchException 76.9% 50%
Weaviate.Client.Analyzers - 91.1%
Name Line Branch
Weaviate.Client.Analyzers 91.1% 71.1%
Weaviate.Client.Analyzers.AggregatePropertySuffixAnalyzer 90% 66.6%
Weaviate.Client.Analyzers.AutoArrayUsageAnalyzer 95.4% 71.4%
Weaviate.Client.Analyzers.HybridSearchNullParametersAnalyzer 90.2% 78.5%
Weaviate.Client.Analyzers.RequiresVersionEnsureCallAnalyzer 87.8% 53.3%
Weaviate.Client.Analyzers.VectorizerFactoryAnalyzer 94.3% 82.7%

VideoIntervalSeconds = videoIntervalSeconds,
ModelId = model,
Dimensions = dimensions,
VectorizeCollectionName = vectorizeCollectionName,

Choose a reason for hiding this comment

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

this setting is not applicable to multi2vec modules, so you can remove it

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Do you mean vectorizeCollectionName?

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds support for the multi2vec-google-gemini vectorizer configuration, allowing the use of Google's Gemini API for multi-modal (image, text, video) embeddings. Unlike Multi2VecGoogle (which targets Vertex AI and requires ProjectId and Location), the new Multi2VecGoogleGemini targets Google AI Studio and only needs an optional apiEndpoint (defaulting to generativelanguage.googleapis.com). The PR also updates the README to remove beta warnings and update documentation URLs to production.

Changes:

  • Added Multi2VecGoogleGemini record class in Vectorizer.cs with [Vectorizer("multi2vec-google-gemini")] attribute and all relevant properties
  • Added two Multi2VecGoogleGemini factory method overloads in VectorizerFactory.cs (one with WeightedFields, one with string[]?)
  • README updated: removed beta warning, updated documentation URLs from staging to production, consolidated feedback section

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
src/Weaviate.Client/Models/Vectorizer.cs Adds the Multi2VecGoogleGemini record with all config properties
src/Weaviate.Client/Configure/VectorizerFactory.cs Adds two factory method overloads for creating Multi2VecGoogleGemini configs
memory/MEMORY.md AI agent session artifact unintentionally committed to the repo
README.md Removes beta disclaimer, updates docs/quickstart links to production, consolidates the Community/Feedback section

Comment on lines +385 to +440
public VectorizerConfig Multi2VecGoogleGemini(
WeightedFields imageFields,
WeightedFields textFields,
WeightedFields videoFields,
string? apiEndpoint = null,
int? videoIntervalSeconds = null,
string? model = null,
int? dimensions = null,
bool? vectorizeCollectionName = null
) =>
new Multi2VecGoogleGemini
{
ApiEndpoint = apiEndpoint ?? "generativelanguage.googleapis.com",
ImageFields = imageFields,
TextFields = textFields,
VideoFields = videoFields,
VideoIntervalSeconds = videoIntervalSeconds,
ModelId = model,
Dimensions = dimensions,
VectorizeCollectionName = vectorizeCollectionName,
Weights = VectorizerWeights.FromWeightedFields(imageFields, textFields, videoFields),
};

/// <summary>
/// Multi2Vec Google Gemini configuration (using Google AI Studio/Gemini API)
/// </summary>
/// <param name="imageFields">The image fields</param>
/// <param name="textFields">The text fields</param>
/// <param name="videoFields">The video fields</param>
/// <param name="apiEndpoint">The API endpoint</param>
/// <param name="videoIntervalSeconds">The video interval seconds</param>
/// <param name="model">The model</param>
/// <param name="dimensions">The dimensions</param>
/// <param name="vectorizeCollectionName">The vectorize collection name</param>
/// <returns>The vectorizer config</returns>
public VectorizerConfig Multi2VecGoogleGemini(
string[]? imageFields = null,
string[]? textFields = null,
string[]? videoFields = null,
string? apiEndpoint = null,
int? videoIntervalSeconds = null,
string? model = null,
int? dimensions = null,
bool? vectorizeCollectionName = null
) =>
new Multi2VecGoogleGemini
{
ApiEndpoint = apiEndpoint ?? "generativelanguage.googleapis.com",
ImageFields = imageFields,
TextFields = textFields,
VideoFields = videoFields,
VideoIntervalSeconds = videoIntervalSeconds,
ModelId = model,
Dimensions = dimensions,
VectorizeCollectionName = vectorizeCollectionName,
};
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

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

The two new public factory method overloads Multi2VecGoogleGemini(WeightedFields, ...) and Multi2VecGoogleGemini(string[]?, ...) are not registered in src/Weaviate.Client/PublicAPI.Unshipped.txt. The project uses a Roslyn API analyzer (Roslyn Analyzers RS0016) that enforces this file, as evidenced by all other public factory methods being listed there (e.g., Multi2VecGoogle, Multi2VecVoyageAI, Multi2VecJinaAI). The build will fail unless these entries are added to PublicAPI.Unshipped.txt.

Copilot uses AI. Check for mistakes.
memory/MEMORY.md Outdated
Comment on lines +1 to +29
# Project Memory: weaviate/csharp-client

## Workflow Preferences
- **Always pause for code review before committing.** Stage changes, show a diff summary, and wait for user approval before running `git commit`.
- PRs target the current branch (`v1.0.1`) as base, not `main`.
- All work in a session creates PRs that merge to the current branch.
- **Do NOT commit intermediate docs or plans** (design docs, plan files). Only commit code changes.

## Project Structure
- `src/Weaviate.Client/` — main library
- `src/Weaviate.Client.Tests/` — tests (Unit/ and Integration/)
- DTOs are auto-generated via NSwag from `Rest/Schema/openapi.json` → `Rest/Dto/Models.g.cs`
- Public API surface tracked in `PublicAPI.Unshipped.txt` (Roslyn analyzer enforces this)
- Pre-commit hooks: dotnet build + CSharpier formatting

## Key Patterns
- REST layer: `Rest/Endpoints.cs` (paths) + `Rest/Collection.cs` / other partials (HTTP calls)
- Public API: `CollectionConfigClient.cs`, `CollectionConfigFactory`, etc.
- Enum → API string: use `ToEnumMemberString()` from `Extensions.cs` (supports both `[EnumMember]` and `[JsonStringEnumMemberName]`)
- Generated `Dto.*` enums (e.g. `Dto.IndexName`) are the canonical source for API string values
- Internal DTOs use `internal`, public models in `Models/`

## TDD Practice
- Write failing test first, confirm compile error, then implement
- Unit tests use `MockWeaviateClient.CreateWithMockHandler()` + `MockHttpMessageHandler`
- Path assertions: `ShouldHaveMethod(HttpMethod.Delete).ShouldHavePath("/v1/schema/...")`

## Tooling
- **Use csharp-lsp actively** for navigating types, finding usages, and validating changes — prefer LSP-driven analysis over re-reading files manually
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

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

The memory/MEMORY.md file appears to be an AI agent session artifact (a scratch-pad for the Copilot Coding Agent) and should not be committed to the repository. It documents internal workflow preferences such as "Always pause for code review before committing" and "PRs target the current branch (v1.0.1) as base, not main." These are not meant to be part of the project's source code or history. This file should either be excluded via .gitignore or removed from the PR entirely.

Suggested change
# Project Memory: weaviate/csharp-client
## Workflow Preferences
- **Always pause for code review before committing.** Stage changes, show a diff summary, and wait for user approval before running `git commit`.
- PRs target the current branch (`v1.0.1`) as base, not `main`.
- All work in a session creates PRs that merge to the current branch.
- **Do NOT commit intermediate docs or plans** (design docs, plan files). Only commit code changes.
## Project Structure
- `src/Weaviate.Client/` — main library
- `src/Weaviate.Client.Tests/` — tests (Unit/ and Integration/)
- DTOs are auto-generated via NSwag from `Rest/Schema/openapi.json``Rest/Dto/Models.g.cs`
- Public API surface tracked in `PublicAPI.Unshipped.txt` (Roslyn analyzer enforces this)
- Pre-commit hooks: dotnet build + CSharpier formatting
## Key Patterns
- REST layer: `Rest/Endpoints.cs` (paths) + `Rest/Collection.cs` / other partials (HTTP calls)
- Public API: `CollectionConfigClient.cs`, `CollectionConfigFactory`, etc.
- Enum → API string: use `ToEnumMemberString()` from `Extensions.cs` (supports both `[EnumMember]` and `[JsonStringEnumMemberName]`)
- Generated `Dto.*` enums (e.g. `Dto.IndexName`) are the canonical source for API string values
- Internal DTOs use `internal`, public models in `Models/`
## TDD Practice
- Write failing test first, confirm compile error, then implement
- Unit tests use `MockWeaviateClient.CreateWithMockHandler()` + `MockHttpMessageHandler`
- Path assertions: `ShouldHaveMethod(HttpMethod.Delete).ShouldHavePath("/v1/schema/...")`
## Tooling
- **Use csharp-lsp actively** for navigating types, finding usages, and validating changes — prefer LSP-driven analysis over re-reading files manually
# Internal Notes
This directory is not used for source code and should not contain AI agent
scratchpads, session artifacts, or transient planning documents.
Contributors should refer to the main project documentation and contribution
guidelines for workflow, testing practices, and coding standards.
If additional persistent documentation is needed, please add it under the
existing documentation locations (for example, within the main `docs/`
or root-level markdown files) rather than using this directory.

Copilot uses AI. Check for mistakes.
mpartipilo and others added 2 commits March 5, 2026 19:20
- Remove dimensions property from Multi2VecGoogleGemini (not applicable)
- Remove dimensions parameter from both factory method overloads
- Add public API entries for Multi2VecGoogleGemini factory methods
- Remove accidentally committed memory/MEMORY.md file

Co-authored-by: antas-marcin <antas-marcin@users.noreply.github.com>
- Remove dimensions property (not applicable to multi2vec modules)
- Rename ModelId to Model (maintain wire format as 'modelId')
- Remove VectorizeCollectionName (not used in multi2vec modules)
- Update both factory method overloads
- Update PublicAPI.Unshipped.txt with correct signatures
- Remove accidentally committed memory/MEMORY.md

Co-authored-by: antas-marcin <antas-marcin@users.noreply.github.com>
Copy link

@orca-security-eu orca-security-eu bot left a comment

Choose a reason for hiding this comment

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

Orca Security Scan Summary

Status Check Issues by priority
Passed Passed Secrets high 0   medium 0   low 0   info 0 View in Orca

@mpartipilo mpartipilo merged commit 7faab01 into v1.0.1 Mar 5, 2026
18 of 20 checks passed
@mpartipilo mpartipilo deleted the feature/multi2vec-google-gemini-api-endpoint branch March 5, 2026 20:01
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.

Add support for multi2vec_google_gemini vectorizer configuration

4 participants