Skip to content

.NET: [Bug]: Request processing fails when web search is enabled because of an unsupported web_search_options parameter #7578

Closed

Description

@meisterfranz

Description

When I enable the web search tool in my AI agent and send a message, the request processing immediately fails with an exception indicating that the web_search_options parameter is not recognized.

Code Sample

services.AddAIAgent(name: agentName, instructions: agentInstructions)
            .WithAITool(new HostedWebSearchTool()) // enabling web search tool
            .WithInMemorySessionStore(false)

Error Messages / Stack Traces

fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
      An unhandled exception has occurred while executing the request.
      System.ClientModel.ClientResultException: HTTP 400 (invalid_request_error: unknown_parameter)
      Parameter: web_search_options
      
      Unknown parameter: 'web_search_options'.
         at OpenAI.ClientPipelineExtensions.ProcessMessageAsync(ClientPipeline pipeline, PipelineMessage message, RequestOptions options)
         at OpenAI.Chat.ChatClient.CompleteChatAsync(BinaryContent content, RequestOptions options)
         at OpenAI.Chat.ChatClient.<>c__DisplayClass20_0.<<CompleteChatStreamingAsync>b__0>d.MoveNext()
      --- End of stack trace from previous location ---
         at OpenAI.AsyncSseUpdateCollection`1.GetRawPagesAsync()+MoveNext()
         at OpenAI.AsyncSseUpdateCollection`1.GetRawPagesAsync()+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+MoveNext()
         at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+MoveNext()
         at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Extensions.AI.OpenAIChatClient.FromOpenAIStreamingChatCompletionAsync(IAsyncEnumerable`1 updates, ChatCompletionOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Extensions.AI.OpenAIChatClient.FromOpenAIStreamingChatCompletionAsync(IAsyncEnumerable`1 updates, ChatCompletionOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Extensions.AI.OpenAIChatClient.FromOpenAIStreamingChatCompletionAsync(IAsyncEnumerable`1 updates, ChatCompletionOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Extensions.AI.ConfigureOptionsChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Extensions.AI.ConfigureOptionsChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Extensions.AI.ConfigureOptionsChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Extensions.AI.FunctionInvokingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Extensions.AI.FunctionInvokingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Extensions.AI.FunctionInvokingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.ApprovalNotRequiredFunctionBypassingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ApprovalNotRequiredFunctionBypassingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ApprovalNotRequiredFunctionBypassingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.ApprovalResponseBindingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ApprovalResponseBindingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ApprovalResponseBindingChatClient.GetStreamingResponseAsync(IEnumerable`1 messages, ChatOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.ChatClientAgent.RunCoreStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ChatClientAgent.RunCoreStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ChatClientAgent.RunCoreStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.ChatClientAgent.RunCoreStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.AIAgent.RunStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.AIAgent.RunStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.AIAgent.RunStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.AIAgent.RunStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.AIAgent.RunStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.AIAgent.RunStreamingAsync(IEnumerable`1 messages, AgentSession session, AgentRunOptions options, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.AgentResponseExtensions.AsChatResponseUpdatesAsync(IAsyncEnumerable`1 responseUpdates)+MoveNext()
         at Microsoft.Agents.AI.AgentResponseExtensions.AsChatResponseUpdatesAsync(IAsyncEnumerable`1 responseUpdates)+MoveNext()
         at Microsoft.Agents.AI.AgentResponseExtensions.AsChatResponseUpdatesAsync(IAsyncEnumerable`1 responseUpdates)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at AGUI.Server.ChatResponseUpdateAGUIExtensions.CoreAsync(IAsyncEnumerable`1 updates, ChatRequestContext context, CancellationToken cancellationToken)+MoveNext()
         at AGUI.Server.ChatResponseUpdateAGUIExtensions.CoreAsync(IAsyncEnumerable`1 updates, ChatRequestContext context, CancellationToken cancellationToken)+MoveNext()
         at AGUI.Server.ChatResponseUpdateAGUIExtensions.CoreAsync(IAsyncEnumerable`1 updates, ChatRequestContext context, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.Agents.AI.Hosting.AGUI.AspNetCore.AGUIEndpointRouteBuilderExtensions.SaveSessionAfterStreamingAsync(IAsyncEnumerable`1 events, AIHostAgent hostAgent, String threadId, AgentSession session, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.Hosting.AGUI.AspNetCore.AGUIEndpointRouteBuilderExtensions.SaveSessionAfterStreamingAsync(IAsyncEnumerable`1 events, AIHostAgent hostAgent, String threadId, AgentSession session, CancellationToken cancellationToken)+MoveNext()
         at Microsoft.Agents.AI.Hosting.AGUI.AspNetCore.AGUIEndpointRouteBuilderExtensions.SaveSessionAfterStreamingAsync(IAsyncEnumerable`1 events, AIHostAgent hostAgent, String threadId, AgentSession session, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
         at Microsoft.AspNetCore.Http.HttpResults.ServerSentEventsResult`1.WrapEvents(IAsyncEnumerable`1 events, String eventType)+MoveNext()
         at Microsoft.AspNetCore.Http.HttpResults.ServerSentEventsResult`1.WrapEvents(IAsyncEnumerable`1 events, String eventType)+MoveNext()
         at System.Net.ServerSentEvents.SseFormatter.WriteAsyncCore[T](IAsyncEnumerable`1 source, Stream destination, Action`2 itemFormatter, CancellationToken cancellationToken)
         at System.Net.ServerSentEvents.SseFormatter.WriteAsyncCore[T](IAsyncEnumerable`1 source, Stream destination, Action`2 itemFormatter, CancellationToken cancellationToken)
         at Microsoft.AspNetCore.Http.HttpResults.ServerSentEventsResult`1.ExecuteAsync(HttpContext httpContext)
         at Microsoft.AspNetCore.Http.Generated.<GeneratedRouteBuilderExtensions_g>FL87DEE35F409427C0994BF3A8D11207C7ZAB7E4167B350548AEB07B262E3F58E__GeneratedRouteBuilderExtensionsCore.<>c__DisplayClass2_0.<<MapPost0>g__RequestHandler|5>d.MoveNext()

Package Versions

Microsoft.Agents.AI.Hosting 1.17.0-preview.260804.1, Microsoft.Agents.AI.Hosting.AGUI.AspNetCore 1.17.0-preview.260804.1, Microsoft.Agents.AI.Hosting.OpenAI 1.17.0-alpha.260804.1

.NET Version

.NET 10

Additional Context

No response

Activity

  1. added
    reproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow
    on Aug 9, 2026
  2. github-actions commented on Aug 9, 2026

    @github-actions
    Contributor

    🤖 Automated triage reproduction notes (agent-authored — trust but verify)

    Agent analysis

    Repro: ChatClientAgentRunOptionsConverter.ToRequestInfo() in dotnet/src/Microsoft.Agents.AI.Hosting.OpenAI/ChatCompletions/Converters/ChatClientAgentRunOptionsConverter.cs (line 19-32) does not include WebSearchOptions from CreateChatCompletion when building the OpenAIChatCompletionRequestInfo. When HostedWebSearchTool is added via WithAITool() or HarnessAgent defaults (HarnessAgent.cs:281), it flows unchanged to M.E.AI's OpenAIChatClient which serializes it as web_search_options — rejected by endpoints that don't support it. Minimal repro: create a ChatClientAgent with HostedWebSearchTool in ChatOptions.Tools and invoke it against any non-search OpenAI model endpoint.

    • Failing test: none
    • Files examined: dotnet/src/Microsoft.Agents.AI.Hosting.OpenAI/ChatCompletions/Models/CreateChatCompletion.cs, dotnet/src/Microsoft.Agents.AI.Hosting.OpenAI/ChatCompletions/Converters/ChatClientAgentRunOptionsConverter.cs, dotnet/src/Microsoft.Agents.AI.Harness/HarnessAgent.cs, dotnet/src/Microsoft.Agents.AI.Hosting/AgentHostingServiceCollectionExtensions.cs, dotnet/src/Microsoft.Agents.AI/ChatClient/ChatClientAgent.cs
    • Tests run: dotnet/tests/Microsoft.Agents.AI.Hosting.OpenAI.UnitTests/WebSearchOptionsReproTests.cs (4 tests, all passed — demonstrating the conversion gap)
    • Reported version: 1.17.0-preview.260804.1
  3. added
    agentsUsage: [Issues, PRs], Target: Single agent
    and removed
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Aug 10, 2026
  4. meisterfranz commented on Sep 30, 2026

    @meisterfranz
    Author

    Hi Roger Barreto (@rogerbarreto), I’m using the latest version, 1.23.0, but the issue still hasn’t been fixed.
    Unknown parameter: 'web_search_options'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

.NETUsage: [Issues, PRs], Target: .NetagentsUsage: [Issues, PRs], Target: Single agentreproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions