mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
52 lines
2.7 KiB
C#
52 lines
2.7 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System;
|
|
using Microsoft.Agents.AI.Workflows;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Shared.Diagnostics;
|
|
|
|
namespace Microsoft.Agents.AI.Hosting;
|
|
|
|
/// <summary>
|
|
/// Provides extension methods for configuring AI workflows in a host application builder.
|
|
/// </summary>
|
|
public static class HostApplicationBuilderWorkflowExtensions
|
|
{
|
|
/// <summary>
|
|
/// Registers a custom workflow using a factory delegate.
|
|
/// </summary>
|
|
/// <param name="builder">The <see cref="IHostApplicationBuilder"/> to configure.</param>
|
|
/// <param name="name">The unique name for the workflow.</param>
|
|
/// <param name="createWorkflowDelegate">A factory function that creates the <see cref="Workflow"/> instance. The function receives the service provider and workflow name as parameters.</param>
|
|
/// <param name="lifetime">The DI service lifetime for the workflow registration. Defaults to <see cref="ServiceLifetime.Singleton"/>.</param>
|
|
/// <returns>An <see cref="IHostedWorkflowBuilder"/> that can be used to further configure the workflow.</returns>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="builder"/>, <paramref name="name"/>, or <paramref name="createWorkflowDelegate"/> is null.</exception>
|
|
/// <exception cref="ArgumentException">Thrown when <paramref name="name"/> is empty.</exception>
|
|
/// <exception cref="InvalidOperationException">
|
|
/// Thrown when the factory delegate returns null or a workflow with a name that doesn't match the expected name.
|
|
/// </exception>
|
|
public static IHostedWorkflowBuilder AddWorkflow(this IHostApplicationBuilder builder, string name, Func<IServiceProvider, string, Workflow> createWorkflowDelegate, ServiceLifetime lifetime = ServiceLifetime.Singleton)
|
|
{
|
|
Throw.IfNull(builder);
|
|
Throw.IfNull(name);
|
|
Throw.IfNull(createWorkflowDelegate);
|
|
|
|
builder.Services.AddKeyedService(name, (sp, key) =>
|
|
{
|
|
Throw.IfNull(key);
|
|
var keyString = key as string;
|
|
Throw.IfNullOrEmpty(keyString);
|
|
var workflow = createWorkflowDelegate(sp, keyString) ?? throw new InvalidOperationException($"The agent factory did not return a valid {nameof(Workflow)} instance for key '{keyString}'.");
|
|
if (!string.Equals(workflow.Name, keyString, StringComparison.Ordinal))
|
|
{
|
|
throw new InvalidOperationException($"The workflow factory returned workflow with name '{workflow.Name}', but the expected name is '{keyString}'.");
|
|
}
|
|
|
|
return workflow;
|
|
}, lifetime);
|
|
|
|
return new HostedWorkflowBuilder(name, builder);
|
|
}
|
|
}
|