Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

.NET: [Bug]: AddAGUIServer's JSON setup writes null optional fields (rejected by @ag-ui/client) and cannot serialize interrupts

Open
#8,962 4 comments 1 reaction 1 assignee View on GitHub

Maintainers usually reply within 1 day

@javiercn is already working on this.

Since Oct 2, 2026.

Assessment

This issue has not been assessed yet.

Description

.NET ag-ui hosting reproduced
Description

MapAGUIServer writes a stream that the official AG-UI TypeScript client (@ag-ui/client 1.0.1, used by CopilotKit 1.76) rejects. Separately, any interrupt makes the run end in RUN_ERROR. Both defects come from ConfigureAGUIJsonOptions in Microsoft.Agents.AI.Hosting.AGUI.AspNetCore, which AddAGUIServer() registers:

// Microsoft.Agents.AI.Hosting.AGUI.AspNetCore.ConfigureAGUIJsonOptions (1.23.0-preview.260928.1, decompiled)
public void Configure(JsonOptions options)
{
    var chain = options.SerializerOptions.TypeInfoResolverChain;
    chain.Add(AgentAbstractionsJsonUtilities.DefaultOptions.TypeInfoResolver);
    chain.Add(((JsonSerializerContext)AGUIJsonSerializerContext.Default).Options.TypeInfoResolver);
}

1. Optional event fields are written as null, and the official client rejects them.

  • Cause: the method appends the raw AGUIJsonSerializerContext resolver. AGUI.Abstractions documents AGUIJsonUtilities.DefaultTypeInfoResolver (that context plus OmitPropertiesWithoutAValue) as the resolver to use instead.
  • What happens: RUN_STARTED goes out with "parentRunId": null and "input": null, and interrupts carry "subagentRunId": null. @ag-ui/client's schema validation fails on the first event, so no run can be followed from a browser.
  • Expected: optional fields without a value are omitted, as AGUIJsonUtilities.DefaultTypeInfoResolver does.

2. Interrupts cannot be serialized.

  • Cause: the method never calls AGUIJsonUtilities.RegisterInterruptContentTypes.
  • What happens: an agent that yields InterruptRequestContent makes the server fail the run. The same happens when the response update containing one is serialized, for example for rawEvent. The client receives RUN_ERROR ("An error occurred while streaming the agent response.") instead of a RUN_FINISHED whose outcome is an interrupt.
  • Expected: AddAGUIServer() registers the interrupt content types, so the protocol's own interrupt/resume works out of the box.

Steps to reproduce

  1. Use builder.Services.AddAGUIServer(); and app.MapAGUIServer("/agui", agent); with any ChatClientAgent.
  2. POST a run and read the stream with @ag-ui/client's HttpAgent. You get a ZodError on RUN_STARTED (defect 1).
  3. Have the agent's chat client yield new ChatResponseUpdate(ChatRole.Assistant, [new InterruptRequestContent("ask-1") { Reason = "input_required", Message = "?" }]). The run ends in RUN_ERROR (defect 2).
Code Sample
```csharp
// Workaround we use today; with it, both cases work end to end with @ag-ui/client and CopilotKit.
builder.Services.AddAGUIServer();
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(o =>
    AGUIJsonUtilities.RegisterInterruptContentTypes(o.SerializerOptions));
builder.Services.PostConfigure<Microsoft.AspNetCore.Http.Json.JsonOptions>(o =>
    o.SerializerOptions.TypeInfoResolverChain.Insert(0, AGUIJsonUtilities.DefaultTypeInfoResolver));
```
Error Messages / Stack Traces
```
// 1 — @ag-ui/client 1.0.1 on RUN_STARTED:
ZodError: parentRunId: expected string, received null; input: expected object, received null

// 2 — server, when an InterruptRequestContent is serialized:
System.NotSupportedException: Runtime type 'AGUI.Abstractions.InterruptRequestContent' is not supported by polymorphic type 'Microsoft.Extensions.AI.AIContent'.
```
Package Versions

Microsoft.Agents.AI.Hosting.AGUI.AspNetCore: 1.23.0-preview.260928.1, Microsoft.Agents.AI: 1.23.0, Microsoft.Agents.AI.Hosting: 1.23.0-preview.260928.1, AGUI.Abstractions: 1.0.0, AGUI.Server: 1.0.0, Microsoft.Extensions.AI.Abstractions: 10.10.1

.NET Version

.NET 10 (SDK 10.0.401)

Additional Context
  • Version scope: 1.22.0-preview.260918.1 has the same ConfigureAGUIJsonOptions, and it also targets AGUI.* 0.0.6.
  • Suggested fix: in ConfigureAGUIJsonOptions.Configure, insert AGUIJsonUtilities.DefaultTypeInfoResolver (rather than adding the raw context) and call AGUIJsonUtilities.RegisterInterruptContentTypes(options.SerializerOptions).
Dominant language
Python
Stars
13.9k
Forks
2.4k
Avg merge
1d 16h
Merged PRs (30d)
432

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from microsoft/agent-framework

All issues in microsoft/agent-framework

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.