Skip to content

spring.ai.openai.moderation.options.* properties ignored due to immutable initialization in OpenAiModerationProperties #4708

@jacquicollier2-eng

Description

@jacquicollier2-eng

Description

When configuring the OpenAI Moderation model in application.yml, the property:

spring:
  ai:
    openai:
      moderation:
        options:
          model: omni-moderation

is silently ignored — the model always defaults to text-moderation-latest.

Root cause

In OpenAiModerationProperties, the options field is initialized via a builder call that immediately constructs an immutable OpenAiModerationOptions instance:

@NestedConfigurationProperty
private final OpenAiModerationOptions options = OpenAiModerationOptions.builder().build();

Because:

the field is final,

the instance is pre-built, and

there is no setter,

Spring Boot’s @ConfigurationProperties binder cannot modify or replace this object.
Thus, the YAML values under spring.ai.openai.moderation.options.* are never applied.

Expected behavior

The YAML configuration should override the model, e.g.:

spring:
  ai:
    openai:
      moderation:
        options:
          model: omni-moderation

should cause OpenAiModerationOptions.getModel() to return "omni-moderation".

Proposed fix

In OpenAiModerationProperties, replace the current initialization with a mutable, bindable instance:

@NestedConfigurationProperty
private final OpenAiModerationOptions options = new OpenAiModerationOptions();

or, ideally, make it non-final and add a setter:

@NestedConfigurationProperty
private OpenAiModerationOptions options = new OpenAiModerationOptions();

public void setOptions(OpenAiModerationOptions options) {
this.options = options;
}

This allows Spring Boot’s configuration binder to correctly populate nested properties.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions