// Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; using Microsoft.SemanticKernel.Agents.Orchestration; using Microsoft.SemanticKernel.Agents.Orchestration.Sequential; using Microsoft.SemanticKernel.Agents.Runtime.InProcess; namespace GettingStarted.Orchestration; /// /// Demonstrates how to use the for /// executing multiple agents in sequence, i.e.the output of one agent is /// the input to the next agent. /// public class Step02_Sequential(ITestOutputHelper output) : BaseOrchestrationTest(output) { [Theory] [InlineData(false)] [InlineData(true)] public async Task SequentialTaskAsync(bool streamedResponse) { // Define the agents ChatCompletionAgent analystAgent = this.CreateChatCompletionAgent( name: "Analyst", instructions: """ You are a marketing analyst. Given a product description, identify: - Key features - Target audience - Unique selling points """, description: "A agent that extracts key concepts from a product description."); ChatCompletionAgent writerAgent = this.CreateChatCompletionAgent( name: "copywriter", instructions: """ You are a marketing copywriter. Given a block of text describing features, audience, and USPs, compose a compelling marketing copy (like a newsletter section) that highlights these points. Output should be short (around 150 words), output just the copy as a single text block. """, description: "An agent that writes a marketing copy based on the extracted concepts."); ChatCompletionAgent editorAgent = this.CreateChatCompletionAgent( name: "editor", instructions: """ You are an editor. Given the draft copy, correct grammar, improve clarity, ensure consistent tone, give format and make it polished. Output the final improved copy as a single text block. """, description: "An agent that formats and proofreads the marketing copy."); // Create a monitor to capturing agent responses (via ResponseCallback) // to display at the end of this sample. (optional) // NOTE: Create your own callback to capture responses in your application or service. OrchestrationMonitor monitor = new(); // Define the orchestration SequentialOrchestration orchestration = new(analystAgent, writerAgent, editorAgent) { LoggerFactory = this.LoggerFactory, ResponseCallback = monitor.ResponseCallback, StreamingResponseCallback = streamedResponse ? monitor.StreamingResultCallback : null, }; // Start the runtime InProcessRuntime runtime = new(); await runtime.StartAsync(); // Run the orchestration string input = "An eco-friendly stainless steel water bottle that keeps drinks cold for 24 hours"; Console.WriteLine($"\n# INPUT: {input}\n"); OrchestrationResult result = await orchestration.InvokeAsync(input, runtime); string text = await result.GetValueAsync(TimeSpan.FromSeconds(ResultTimeoutInSeconds)); Console.WriteLine($"\n# RESULT: {text}"); await runtime.RunUntilIdleAsync(); Console.WriteLine("\n\nORCHESTRATION HISTORY"); foreach (ChatMessageContent message in monitor.History) { this.WriteAgentChatMessage(message); } } }