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 us

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. 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
  2. Remove/disable the obsolete vectorizer entry from moduleConfig if it was left over from a previous config
  3. Move multi-vector vectorizers (multi2vec-*) into named-vector configuration (moduleConfig named-vectors section) instead of class.vectorizer
  4. 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

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


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/9a8515ff8013b07a. Report an issue: GitHub.