microsoft/semantic-kernel · error · NotSupportedException

The provided response modalities '{modalityString}' is not s

Error message

The provided response modalities '{modalityString}' is not supported.

What it means

Thrown inside ParseResponseModalitiesEnumerable when Modalities is an enumerable of strings and one element does not parse (case-insensitive) into the ChatResponseModalities flags enum (e.g. Text, Audio, Image). The offending token is reported.

Source

Thrown at dotnet/src/Connectors/Connectors.OpenAI/Core/ClientCore.ChatCompletion.cs:1131

    /// <item><description>A string representation of the enum (e.g., "Text, Audio")</description></item>
    /// <item><description>An <see cref="IEnumerable{String}"/> of modality names (e.g., ["text", "audio"])</description></item>
    /// <item><description>A <see cref="JsonElement"/> containing either a string, or array of strings</description></item>
    /// </list>
    /// </remarks>
    private static ChatResponseModalities GetResponseModalities(OpenAIPromptExecutionSettings executionSettings)
    {
        static ChatResponseModalities ParseResponseModalitiesEnumerable(IEnumerable<string> responseModalitiesStrings)
        {
            ChatResponseModalities result = ChatResponseModalities.Default;
            foreach (var modalityString in responseModalitiesStrings)
            {
                if (Enum.TryParse<ChatResponseModalities>(modalityString, true, out var parsedModality))
                {
                    result |= parsedModality;
                }
                else
                {
                    throw new NotSupportedException($"The provided response modalities '{modalityString}' is not supported.");
                }
            }

            return result;
        }

        if (executionSettings.Modalities is null)
        {
            return ChatResponseModalities.Default;
        }

        if (executionSettings.Modalities is ChatResponseModalities responseModalities)
        {
            return responseModalities;
        }

        if (executionSettings.Modalities is IEnumerable<string> responseModalitiesStrings)
        {

View on GitHub (pinned to c028a0c7dc)

Solutions

  1. Use only ChatResponseModalities member names (Text, Audio, Image, Default, etc.) in the enumerable.
  2. Trim each string before adding it.
  3. If unsure of valid names, enumerate typeof(ChatResponseModalities).GetEnumNames() and filter input.

Example fix

// before
settings.Modalities = new[] { "text", "video" };
// after
settings.Modalities = new[] { "text", "audio" };
Defensive patterns

Strategy: validation

Validate before calling

static IEnumerable<string> NormalizeModalities(IEnumerable<string> ms) { var names = typeof(ChatResponseModalities).GetEnumNames(); foreach (var m in ms) { var t = m.Trim(); if (!names.Any(n => n.Equals(t, StringComparison.OrdinalIgnoreCase))) throw new ArgumentException($"Unknown modality {m}"); yield return t; } }

Type guard

static bool AreModalitiesValid(IEnumerable<string> ms) { var names = typeof(ChatResponseModalities).GetEnumNames(); return ms.All(m => names.Any(n => n.Equals(m.Trim(), StringComparison.OrdinalIgnoreCase))); }

Try / catch

try { await client.GetChatCompletionAsync(...); }
catch (NotSupportedException ex) when (ex.Message.Contains("response modalities")) { /* filter to valid names and retry */ }

Prevention

When it happens

Trigger: executionSettings.Modalities is a string[]/List<string> and contains a value that is not a ChatResponseModalities member, e.g. ["text","video"] or ["txt"].

Common situations: Config-driven modality lists with typos or vendor-specific tokens; copying modality names from a different provider; uppercase/spacing mistakes (Enum.TryParse is case-insensitive but not whitespace-tolerant).

Related errors


AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13). Data as JSON: /api/errors/a3e8ea2634af39ad. Report an issue: GitHub.