Minor cleanup. MCP tool works.

This commit is contained in:
Shyju Krishnankutty
2026-01-21 17:39:53 -08:00
Unverified
parent ce96daf05a
commit 97ac897dff
3 changed files with 22 additions and 36 deletions
@@ -7,7 +7,7 @@ namespace SingleAgent;
/// <summary>
/// Parses an Order ID from a string input and returns an Order object populated.
/// </summary>
internal sealed class OrderLookupExecutor() : Executor<string, Order>("OrderLookup")
internal sealed class OrderLookup() : Executor<string, Order>("OrderLookup")
{
public override async ValueTask<Order> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default)
{
@@ -19,7 +19,7 @@ internal sealed class OrderLookupExecutor() : Executor<string, Order>("OrderLook
/// <summary>
/// Enriches an Order object with additional information.
/// </summary>
internal sealed class OrderEnricherExecutor() : Executor<Order, Order>("EnrichOrder")
internal sealed class OrderEnrich() : Executor<Order, Order>("EnrichOrder")
{
public override async ValueTask<Order> HandleAsync(Order message, IWorkflowContext context, CancellationToken cancellationToken = default)
{
@@ -33,7 +33,7 @@ internal sealed class OrderEnricherExecutor() : Executor<Order, Order>("EnrichOr
}
}
internal sealed class PaymentProcessorExecutor() : Executor<Order, Order>("ProcessPayment")
internal sealed class PaymentProcessor() : Executor<Order, Order>("ProcessPayment")
{
public override async ValueTask<Order> HandleAsync(Order message, IWorkflowContext context, CancellationToken cancellationToken = default)
{
@@ -43,6 +43,14 @@ internal sealed class PaymentProcessorExecutor() : Executor<Order, Order>("Proce
}
}
internal sealed class OrderCancel() : Executor<Order, string>("OrderCancel")
{
public override async ValueTask<string> HandleAsync(Order message, IWorkflowContext context, CancellationToken cancellationToken = default)
{
return $"Order {message.Id} cancelled at {DateTime.UtcNow:g} UTC.";
}
}
internal sealed class Order
{
public Order(string id, decimal amount)
@@ -20,12 +20,10 @@ Func<string, string> orderParserFunc = input =>
};
var orderParserExecutor = orderParserFunc.BindAsExecutor("OrderParser");
Func<string, string> cancelOrderFunc = input => $"Cancelled order:{input}";
var orderArchiver = orderParserFunc.BindAsExecutor("OrderArchiver");
OrderLookupExecutor orderLookupExecutor = new();
OrderEnricherExecutor orderEnricherExeecutor = new();
PaymentProcessorExecutor paymentProcessorExecutor = new();
OrderLookup orderLookupExecutor = new();
OrderEnrich orderEnricherExeecutor = new();
PaymentProcessor paymentProcessorExecutor = new();
OrderCancel orderArchiverExecutor = new();
Workflow processOrder = new WorkflowBuilder(orderParserExecutor)
.WithName("FulfillOrder")
@@ -39,12 +37,16 @@ Workflow cancelOrder = new WorkflowBuilder(orderParserExecutor)
.WithName("CancelOrder")
.WithDescription("Cancel an order")
.AddEdge(orderParserExecutor, orderLookupExecutor)
.AddEdge(orderLookupExecutor, orderArchiver)
.AddEdge(orderLookupExecutor, orderArchiverExecutor)
.Build();
var host = FunctionsApplication.CreateBuilder(args)
.ConfigureFunctionsWebApplication()
.ConfigureDurableOptions(options => options.Workflows.AddWorkflow([processOrder, cancelOrder]))
.ConfigureDurableOptions(options =>
{
options.Workflows.AddWorkflow(processOrder);
options.Workflows.AddWorkflow(cancelOrder, true);
})
.Build();
host.Run();
@@ -6,12 +6,10 @@ using Microsoft.Agents.AI.DurableTask;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Mcp;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.DurableTask;
using Microsoft.DurableTask.Client;
using Microsoft.DurableTask.Worker.Grpc;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Microsoft.Agents.AI.Hosting.AzureFunctions;
@@ -244,9 +242,7 @@ internal static class BuiltInFunctions
string workflowName = context.Name;
string orchestrationFunctionName = WorkflowNamingHelper.ToOrchestrationFunctionName(workflowName);
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
orchestrationFunctionName,
new DurableWorkflowRunRequest { WorkflowName = workflowName, Input = input });
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(orchestrationFunctionName, input);
// Wait for the orchestration to complete and return the result
OrchestrationMetadata? metadata = await client.WaitForInstanceCompletionAsync(
@@ -257,26 +253,6 @@ internal static class BuiltInFunctions
return metadata?.ReadOutputAs<string>();
}
#pragma warning disable DURTASK001 // Durable analyzer complained
public static Task<DurableWorkflowRunResult> WorkflowRunnerOrchestrationAsync(TaskOrchestrationContext context, DurableWorkflowRunRequest input)
{
ArgumentNullException.ThrowIfNull(context);
ILogger logger = context.CreateReplaySafeLogger("BuiltInFunctions");
logger.LogInformation("WorkflowRunnerOrchestrationAsync function called.");
FunctionContext? functionContext = context.GetFunctionContext();
if (functionContext == null)
{
throw new InvalidOperationException("FunctionContext is not available in the orchestration context.");
}
var workFlowName = input.WorkflowName;
return Task.FromResult(new DurableWorkflowRunResult(workFlowName, workFlowName));
}
#pragma warning restore DURTASK001
/// <summary>
/// Creates an error response with the specified status code and error message.
/// </summary>