diff --git a/src/Agents/ConfigurableAIAgent.cs b/src/Agents/ConfigurableAIAgent.cs index ea08ee6..3fa1c76 100644 --- a/src/Agents/ConfigurableAIAgent.cs +++ b/src/Agents/ConfigurableAIAgent.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using System.Text.Json; using Devlooped.Extensions.AI; +using Devlooped.Extensions.AI.Grok; using Microsoft.Agents.AI; using Microsoft.Extensions.AI; using Microsoft.Extensions.Configuration; @@ -86,9 +87,11 @@ public override IAsyncEnumerable RunStreamingAsync(IEnum ?? throw new InvalidOperationException($"A client must be specified for agent '{name}' in configuration section '{section}'.")) ?? throw new InvalidOperationException($"Specified chat client '{options?.Client}' for agent '{name}' is not registered."); -#pragma warning disable SYSLIB1100 - var chat = configSection.GetSection("options").Get(); -#pragma warning restore SYSLIB1100 + var provider = client.GetService()?.ProviderName; + ChatOptions? chat = provider == "xai" + ? configSection.GetSection("options").Get() + : configSection.GetSection("options").Get(); + if (chat is not null) options.ChatOptions = chat; diff --git a/src/Tests/ConfigurableAgentTests.cs b/src/Tests/ConfigurableAgentTests.cs index 3f5f4ee..8b25e46 100644 --- a/src/Tests/ConfigurableAgentTests.cs +++ b/src/Tests/ConfigurableAgentTests.cs @@ -1,4 +1,5 @@ using Devlooped.Extensions.AI; +using Devlooped.Extensions.AI.Grok; using Microsoft.Agents.AI; using Microsoft.Extensions.AI; using Microsoft.Extensions.Configuration; @@ -211,5 +212,42 @@ public void CanSetOpenAIReasoningAndVerbosity() Assert.Equal(Verbosity.Low, options?.ChatOptions?.Verbosity); Assert.Equal(ReasoningEffort.Minimal, options?.ChatOptions?.ReasoningEffort); } + + [Fact] + public void CanSetGrokOptions() + { + var builder = new HostApplicationBuilder(); + + builder.Configuration.AddInMemoryCollection(new Dictionary + { + ["ai:clients:grok:modelid"] = "grok-4", + ["ai:clients:grok:apikey"] = "xai-asdfasdf", + ["ai:clients:grok:endpoint"] = "https://api.x.ai", + ["ai:agents:bot:client"] = "grok", + ["ai:agents:bot:options:reasoningeffort"] = "low", + ["ai:agents:bot:options:search"] = "auto", + }); + + var app = builder.AddAIAgents().Build(); + var agent = app.Services.GetRequiredKeyedService("bot"); + var options = agent.GetService(); + + var grok = Assert.IsType(options?.ChatOptions); + + Assert.Equal(ReasoningEffort.Low, grok.ReasoningEffort); + Assert.Equal(GrokSearch.Auto, grok.Search); + + var configuration = (IConfigurationRoot)app.Services.GetRequiredService(); + configuration["ai:agents:bot:options:reasoningeffort"] = "high"; + configuration["ai:agents:bot:options:search"] = "off"; + // NOTE: the in-memory provider does not support reload on change, so we must trigger it manually. + configuration.Reload(); + + options = agent.GetService(); + grok = Assert.IsType(options?.ChatOptions); + + Assert.Equal(ReasoningEffort.High, grok.ReasoningEffort); + Assert.Equal(GrokSearch.Off, grok.Search); + } }