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
- Use only ChatResponseModalities member names (Text, Audio, Image, Default, etc.) in the enumerable.
- Trim each string before adding it.
- 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
- Trim whitespace from each token.
- Filter input against GetEnumNames().
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
- The provided response modalities '{responseModalitiesString}
- The provided response modalities '{executionSettings.Modalit
- Failed to get a response from the chat completion service.
- The provided reasoning effort '{textEffortLevel}' is not sup
- The provided reasoning effort '{effortLevelObject.GetType()}
AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13).
Data as JSON: /api/errors/a3e8ea2634af39ad.
Report an issue: GitHub.