weaviate/weaviate · error
multiple vectorizers configured in class's moduleConfig: %v.
Error message
multiple vectorizers configured in class's moduleConfig: %v. class.vectorizer is set to %q
What it means
During class creation/validation, validateClassesModuleConfig scans class.moduleConfig entries and collects every module that ValidateVectorizer accepts. If more than one vectorizer module is enabled for the class while the legacy class.vectorizer field is also set, the configuration is ambiguous and schema creation fails. Multi-vector vectorizers are additionally restricted to named-vector configuration.
Source
Thrown at usecases/modules/module_config_init_and_validate.go:250
func (p *Provider) validateClassesModuleConfig(ctx context.Context,
class *models.Class, moduleConfig interface{},
) error {
modConfig, ok := moduleConfig.(map[string]interface{})
if !ok {
return nil
}
configuredVectorizers := make([]string, 0, len(modConfig))
for modName := range modConfig {
if err := p.validateClassModuleConfig(ctx, class, modName, ""); err != nil {
return err
}
if err := p.ValidateVectorizer(modName); err == nil {
configuredVectorizers = append(configuredVectorizers, modName)
}
}
if len(configuredVectorizers) > 1 {
return fmt.Errorf("multiple vectorizers configured in class's moduleConfig: %v. class.vectorizer is set to %q",
configuredVectorizers, class.Vectorizer)
}
if len(configuredVectorizers) == 1 && p.IsMultiVector(configuredVectorizers[0]) {
return fmt.Errorf("multi vector vectorizer: %q is only allowed to be defined using named vector configuration", configuredVectorizers[0])
}
if p.IsMultiVector(class.Vectorizer) {
return fmt.Errorf("multi vector vectorizer: %q is only allowed to be defined using named vector configuration", class.Vectorizer)
}
return nil
}
func (p *Provider) validateClassModuleConfig(ctx context.Context,
class *models.Class, moduleName, targetVector string,
) error {
mod := p.GetByName(moduleName)
cc, ok := mod.(modulecapabilities.ClassConfigurator)
if !ok {
// the module exists, but is not a class configurator, nothing to do for usView on GitHub (pinned to 75aa4b6d11)
Solutions
- Keep exactly one vectorizer module in class.moduleConfig and set class.vectorizer to match it, or set class.vectorizer to "none" when using named vectors exclusively
- Remove/disable the obsolete vectorizer entry from moduleConfig if it was left over from a previous config
- Move multi-vector vectorizers (multi2vec-*) into named-vector configuration (moduleConfig named-vectors section) instead of class.vectorizer
- Validate the class JSON against a single-vectorizer setup before submitting to /v1/schema
Example fix
// before
{"class":"Article","vectorizer":"text2vec-openai","moduleConfig":{"text2vec-openai":{},"text2vec-cohere":{}}}
// after: one vectorizer only
{"class":"Article","vectorizer":"text2vec-openai","moduleConfig":{"text2vec-openai":{}}} Defensive patterns
Strategy: validation
Validate before calling
// validate class config before POST /v1/schema
vectorizers := 0
for modName := range class.ModuleConfig {
if isVectorizerModule(modName) { vectorizers++ }
}
if vectorizers > 1 {
return fmt.Errorf("at most one vectorizer allowed; found %d", vectorizers)
}
if vectorizers == 1 && class.Vectorizer != "none" && class.Vectorizer != theVectorizer {
return fmt.Errorf("class.vectorizer %q must match the single configured module", class.Vectorizer)
} Try / catch
err := client.Schema().ClassCreator().WithClass(class).Do(ctx)
if err != nil && strings.Contains(err.Error(), "multiple vectorizers configured") {
return fmt.Errorf("fix class.moduleConfig: keep one vectorizer or use named vectors: %w", err)
} Prevention
- Enable exactly one vectorizer per class (or none when using named vectors)
- Set class.vectorizer to "none" when relying solely on named vectors
- Never set multi-vector vectorizers as legacy class.vectorizer
- Lint class JSON templates for duplicate vectorizer entries before deploy
When it happens
Trigger: POST /v1/schema creating a class whose moduleConfig enables two or more vectorizer modules (e.g. both text2vec-openai and text2vec-cohere) while class.vectorizer is set to a non-'none' value.
Common situations: Copy-pasting moduleConfig examples combining several vectorizers; merging class configs from different environments; leaving an old vectorizer enabled after adding a new one; attempting to set a multi-vector vectorizer (multi2vec-*) as the legacy class.vectorizer instead of under named vectors.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- configured properties don't exist or are not of text or blob
- multi-tenancy is not enabled
- not possible to use the cache without compression
- cannot enable multiple quantization methods at the same time
- endpoint cannot be empty
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/9a8515ff8013b07a.
Report an issue: GitHub.