microsoft/semantic-kernel · error · NotSupportedException

is not for use with .

Error message

{nameof(CopilotStudioAgent)} is not for use with {nameof(AgentChat)}.

What it means

Thrown by CopilotStudioAgent.GetChannelKeys() to signal that CopilotStudioAgent does not participate in the multi-agent AgentChat channel coordination system. The Copilot Studio integration is designed for direct single-agent invocation only; it overrides the channel-related abstract members to throw NotSupportedException to make the limitation explicit at the point AgentChat would try to use them.

Solutions

  1. Do not use CopilotStudioAgent with AgentChat. Invoke it directly via InvokeAsync/InvokeStreamingAsync with a CopilotStudioAgentThread.
  2. If multi-agent orchestration is needed, host the Copilot Studio agent behind a custom adapter that is not registered with AgentChat.
  3. Use a different agent type that supports the AgentChat channel model for multi-agent scenarios.

Example fix

// before — not supported
var chat = new AgentChat { };
chat.AddAgent(copilotAgent); // triggers GetChannelKeys -> NotSupportedException

// after — invoke directly
var thread = new CopilotStudioAgentThread(client);
await foreach (var r in copilotAgent.InvokeAsync(messages, thread)) { ... }
Defensive patterns

Strategy: validation

Validate before calling

// Do not register CopilotStudioAgent with AgentChat
if (agent is CopilotStudioAgent)
    throw new InvalidOperationException("CopilotStudioAgent cannot be used with AgentChat. Invoke directly.");

Type guard

static bool SupportsAgentChat(Microsoft.SemanticKernel.Agents.Agent a) =>
    a is not CopilotStudioAgent;

Try / catch

try { chat.AddAgent(agent); }
catch (NotSupportedException ex) when (ex.Message.Contains("AgentChat"))
{
    logger.LogError("CopilotStudioAgent does not support AgentChat. Use direct InvokeAsync instead.");
    throw;
}

Prevention

When it happens

Trigger: Adding a CopilotStudioAgent to an AgentChat (multi-agent chat) instance, which internally calls GetChannelKeys() to coordinate channels across agents. Because Copilot Studio uses its own conversation/session model, it cannot be wired into the shared channel abstraction.

Common situations: Migrating from a single-agent OpenAI/Bedrock setup to a multi-agent AgentChat and including a Copilot Studio agent; following a multi-agent sample and substituting CopilotStudioAgent.

Related errors


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

Appendix: source

Thrown at dotnet/src/Agents/Copilot/CopilotStudioAgent.cs:127

            {
                await options.OnIntermediateMessage(result).ConfigureAwait(false);
            }

            StreamingChatMessageContent streamedResult = new(result.Role, content: null)
            {
                Items = [.. ContentProcessor.ConvertToStreaming(result.Items, this.Logger)],
                InnerContent = result.InnerContent,
                Metadata = result.Metadata,
            };

            yield return new(streamedResult, agentThread);
        }
    }

    /// <inheritdoc/>
    protected override IEnumerable<string> GetChannelKeys()
    {
        throw new NotSupportedException($"{nameof(CopilotStudioAgent)} is not for use with {nameof(AgentChat)}.");
    }

    /// <inheritdoc/>
    protected override Task<AgentChannel> CreateChannelAsync(CancellationToken cancellationToken)
    {
        throw new NotSupportedException($"{nameof(CopilotStudioAgent)} is not for use with {nameof(AgentChat)}.");
    }

    /// <inheritdoc/>
    protected override Task<AgentChannel> RestoreChannelAsync(string channelState, CancellationToken cancellationToken)
    {
        throw new NotSupportedException($"{nameof(CopilotStudioAgent)} is not for use with {nameof(AgentChat)}.");
    }

    private IAsyncEnumerable<ChatMessageContent> InvokeInternalAsync(ICollection<ChatMessageContent> messages, CopilotStudioAgentThread thread, CancellationToken cancellationToken)
    {
        string question = string.Join(Environment.NewLine, messages.Select(m => m.Content));

View on GitHub (pinned to c028a0c7dc)