Minor cleanup/reorg

This commit is contained in:
Shyju Krishnankutty
2026-01-15 15:15:08 -08:00
Unverified
parent 5dfcfedf1e
commit 1b3c67df96
4 changed files with 88 additions and 44 deletions
@@ -75,7 +75,7 @@ var workflow = builder.WithName("HandleSurveyResponse").Build();
FunctionsApplication.CreateBuilder(args)
.ConfigureFunctionsWebApplication()
//.ConfigureDurableAgents(options => options.AddAIAgent(agent))
.ConfigureDurableAgents(options => options.AddAIAgent(agent))
.ConfigureDurableOptions(options =>
{
// Configure workflows
@@ -0,0 +1,73 @@
// Copyright (c) Microsoft. All rights reserved.
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Azure.Functions.Worker.Core.FunctionMetadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
namespace Microsoft.Agents.AI.Hosting.AzureFunctions;
/// <summary>
/// Shared configuration logic for durable agents and workflows.
/// This class consolidates common service registrations used by both
/// <see cref="FunctionsApplicationBuilderExtensions.ConfigureDurableAgents"/> and
/// <see cref="DurableOptionsExtensions.ConfigureDurableOptions"/>.
/// </summary>
internal static class CoreAgentConfigurationExtensions
{
/// <summary>
/// Registers the core agent services required for durable agents.
/// </summary>
/// <param name="builder">The functions application builder.</param>
/// <returns>The functions application builder for method chaining.</returns>
internal static FunctionsApplicationBuilder RegisterCoreAgentServices(this FunctionsApplicationBuilder builder)
{
builder.Services.TryAddSingleton<IFunctionsAgentOptionsProvider>(_ =>
new DefaultFunctionsAgentOptionsProvider(DurableAgentsOptionsExtensions.GetAgentOptionsSnapshot()));
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IFunctionMetadataTransformer, DurableAgentFunctionMetadataTransformer>());
return builder;
}
/// <summary>
/// Registers the workflow-specific services required for durable workflows.
/// This should only be called when workflows are configured in the application.
/// </summary>
/// <param name="builder">The functions application builder.</param>
/// <returns>The functions application builder for method chaining.</returns>
internal static FunctionsApplicationBuilder RegisterWorkflowServices(this FunctionsApplicationBuilder builder)
{
builder.Services.TryAddSingleton<DurableWorkflowRunner>();
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IFunctionMetadataTransformer, DurableWorkflowFunctionMetadataTransformer>());
return builder;
}
/// <summary>
/// Configures the middleware and executor for handling built-in function execution.
/// This is shared by both agents and workflows, handling Agent HTTP, MCP tool,
/// workflow orchestration, and Entity invocations.
/// </summary>
/// <param name="builder">The functions application builder.</param>
/// <returns>The functions application builder for method chaining.</returns>
internal static FunctionsApplicationBuilder ConfigureBuiltInFunctionMiddleware(this FunctionsApplicationBuilder builder)
{
builder.Services.TryAddSingleton<BuiltInFunctionExecutor>();
builder.UseWhen<BuiltInFunctionExecutionMiddleware>(static context =>
IsBuiltInFunction(context.FunctionDefinition.EntryPoint));
return builder;
}
private static bool IsBuiltInFunction(string? entryPoint)
{
return string.Equals(entryPoint, BuiltInFunctions.RunAgentHttpFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.RunAgentMcpToolFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.RunWorkflowOrechstrtationHttpFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.InvokeWorkflowActivityFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.RunAgentEntityFunctionEntryPoint, StringComparison.Ordinal);
}
}
@@ -3,12 +3,10 @@
using Microsoft.Agents.AI.DurableTask;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Azure.Functions.Worker.Core.FunctionMetadata;
using Microsoft.DurableTask;
using Microsoft.DurableTask.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Microsoft.Agents.AI.Hosting.AzureFunctions;
@@ -41,23 +39,23 @@ public static class DurableOptionsExtensions
RegisterServices(builder, options);
ConfigureAgents(builder, options);
ConfigureMiddleware(builder);
ConfigureWorkflowOrchestration(builder);
builder.ConfigureBuiltInFunctionMiddleware();
if (options.Workflows.Workflows.Count > 0)
{
builder.RegisterWorkflowServices();
ConfigureWorkflowOrchestration(builder);
}
return builder;
}
private static void RegisterServices(FunctionsApplicationBuilder builder, DurableOptions options)
{
builder.Services.AddSingleton(options);
builder.Services.AddSingleton(options.Agents);
builder.Services.AddSingleton<BuiltInFunctionExecutor>();
builder.Services.AddSingleton<DurableWorkflowRunner>();
builder.Services.AddSingleton<IFunctionMetadataTransformer, DurableAgentFunctionMetadataTransformer>();
builder.Services.AddSingleton<IFunctionMetadataTransformer, DurableWorkflowFunctionMetadataTransformer>();
builder.Services.TryAddSingleton(options);
builder.Services.TryAddSingleton(options.Agents); // backward compatibility. can be removed in future.
builder.Services.TryAddSingleton<IFunctionsAgentOptionsProvider>(_ =>
new DefaultFunctionsAgentOptionsProvider(DurableAgentsOptionsExtensions.GetAgentOptionsSnapshot()));
builder.RegisterCoreAgentServices();
}
private static void ConfigureAgents(FunctionsApplicationBuilder builder, DurableOptions options)
@@ -81,21 +79,6 @@ public static class DurableOptionsExtensions
});
}
private static void ConfigureMiddleware(FunctionsApplicationBuilder builder)
{
builder.UseWhen<BuiltInFunctionExecutionMiddleware>(static context =>
IsBuiltInFunction(context.FunctionDefinition.EntryPoint));
}
private static bool IsBuiltInFunction(string? entryPoint)
{
return string.Equals(entryPoint, BuiltInFunctions.RunAgentHttpFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.RunAgentMcpToolFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.RunWorkflowOrechstrtationHttpFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.InvokeWorkflowActivityFunctionEntryPoint, StringComparison.Ordinal)
|| string.Equals(entryPoint, BuiltInFunctions.RunAgentEntityFunctionEntryPoint, StringComparison.Ordinal);
}
private static void ConfigureWorkflowOrchestration(FunctionsApplicationBuilder builder)
{
// Registering a single orchestration function to handle all workflow runs.
@@ -2,10 +2,6 @@
using Microsoft.Agents.AI.DurableTask;
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Azure.Functions.Worker.Core.FunctionMetadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
namespace Microsoft.Agents.AI.Hosting.AzureFunctions;
@@ -24,24 +20,16 @@ public static class FunctionsApplicationBuilderExtensions
this FunctionsApplicationBuilder builder,
Action<DurableAgentsOptions> configure)
{
ArgumentNullException.ThrowIfNull(builder);
ArgumentNullException.ThrowIfNull(configure);
// The main agent services registration is done in Microsoft.DurableTask.Agents.
builder.Services.ConfigureDurableAgents(configure);
builder.Services.TryAddSingleton<IFunctionsAgentOptionsProvider>(_ =>
new DefaultFunctionsAgentOptionsProvider(DurableAgentsOptionsExtensions.GetAgentOptionsSnapshot()));
builder.RegisterCoreAgentServices();
builder.Services.AddSingleton<IFunctionMetadataTransformer, DurableAgentFunctionMetadataTransformer>();
// Handling of built-in function execution for Agent HTTP, MCP tool, or Entity invocations.
builder.UseWhen<BuiltInFunctionExecutionMiddleware>(static context =>
string.Equals(context.FunctionDefinition.EntryPoint, BuiltInFunctions.RunAgentHttpFunctionEntryPoint, StringComparison.Ordinal) ||
string.Equals(context.FunctionDefinition.EntryPoint, BuiltInFunctions.RunAgentMcpToolFunctionEntryPoint, StringComparison.Ordinal) ||
string.Equals(context.FunctionDefinition.EntryPoint, BuiltInFunctions.RunWorkflowOrechstrtationHttpFunctionEntryPoint, StringComparison.Ordinal) ||
string.Equals(context.FunctionDefinition.EntryPoint, BuiltInFunctions.InvokeWorkflowActivityFunctionEntryPoint, StringComparison.Ordinal) ||
string.Equals(context.FunctionDefinition.EntryPoint, BuiltInFunctions.RunAgentEntityFunctionEntryPoint, StringComparison.Ordinal));
builder.Services.AddSingleton<BuiltInFunctionExecutor>();
// Configure middleware for built-in function execution.
builder.ConfigureBuiltInFunctionMiddleware();
return builder;
}