MAF 最简单的工作流
1 创建AI ChatClent
public class AIChatClient { public IChatClient Client { get; } public string ModelID { get; set; } = "qwen3.7-max-2026-05-17"; public string ApiKey { get; set; } = "sk-cfe92"; public string URl { get; set; } = "https://dashscope.aliyuncs.com/compatible-mode/v1/"; //public string ModelID { get; set; } = "nemotron-3-super:cloud"; //public string ApiKey { get; set; } = "sk-cda1bdc30680422a8a8430fe30bdfe92"; public AIChatClient() { //var key = Environment.GetEnvironmentVariable("OPENAI_API_KEY"); //string apiKey = "sk-cda1bdc30680422a8a8430fe30bdfe92"; //string model = "kimi-k2.6"; //string url = "https://dashscope.aliyuncs.com/compatible-mode/v1/"; // Client = new OpenAIClient(key) //.GetChatClient("kimi-k2.6") // .AsIChatClient(); var options = new OpenAIClientOptions { Endpoint = new Uri(URl), //Transport = new HttpClientPipelineTransport(httpClient) }; // 创建 ChatClient var chatClient = new ChatClient( model: ModelID, credential: new ApiKeyCredential(ApiKey), options: options ); Client = chatClient.AsIChatClient();//作为聊天形式的客户端 } public AIAgent AIAgent(string desc,string ageName) { return Client.AsAIAgent(desc,ageName); } ///// <summary> ///// 调用AI ///// </summary> //public async Task<string> Ask( string prompt) //{ // var result = // await Client.CompleteChatAsync( prompt); // return result // .Value // .Content[0] // .Text; //} }
2 创建工作流执行器
public class UpperCaseExcutor : Executor<string, string> { public UpperCaseExcutor(string id= "UpperCaseExcutor1", ExecutorOptions? options = null, bool declareCrossRunShareable = false) : base(id, options, declareCrossRunShareable) { } public override ValueTask<string> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default) { Console.WriteLine($"Executor received:{message}"); return ValueTask.FromResult(message.ToUpperInvariant()); throw new NotImplementedException(); } } public class LowerCaseExcutor : Executor<string, string> { public LowerCaseExcutor(string id = "LowerCaseExcutor1", ExecutorOptions? options = null, bool declareCrossRunShareable = false) : base(id, options, declareCrossRunShareable) { } public override ValueTask<string> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default) { Console.WriteLine($"Executor received:{message}"); return ValueTask.FromResult(message.ToLowerInvariant()); throw new NotImplementedException(); } } public class AIToLowerExcutor : Executor<IList<ChatMessage>, string> { public AIToLowerExcutor(string id = "AIExcutor1", ExecutorOptions? options = null, bool declareCrossRunShareable = false) : base(id, options, declareCrossRunShareable) { } public override ValueTask<string> HandleAsync(IList<ChatMessage> message, IWorkflowContext context, CancellationToken cancellationToken = default) { // Console.WriteLine($"Executor received:{message}"); string text=string.Join(Environment.NewLine, message.Select(message=>message.Text)); return ValueTask.FromResult(text.ToLowerInvariant()); } }
3 测试案例
public class Test1 { //最简单的工作流,就一个执行者 一个执行器 public static async void Test() { UpperCaseExcutor upperCaseExcutor = new UpperCaseExcutor(); WorkflowBuilder workflowBuilder = new WorkflowBuilder(upperCaseExcutor) .WithOutputFrom(upperCaseExcutor); Workflow workflow= workflowBuilder.Build(); // var run2 = await InProcessExecution.RunAsync(workflow, "hello,how are you"); var run = await InProcessExecution.RunStreamingAsync(workflow, "hello,how are you"); await foreach (WorkflowEvent evt in run.WatchStreamAsync()) { if (evt is WorkflowOutputEvent workflowOutput) { //输出所有事件 Console.WriteLine(evt); Console.WriteLine($"{workflowOutput.ExecutorId}:{workflowOutput.Data}"); MessageBox.Show(workflowOutput.Data.ToString()); } } } //2 个边 public static async void Test2() { UpperCaseExcutor upperCaseExcutor = new UpperCaseExcutor(); LowerCaseExcutor lowerCaseExcutor = new LowerCaseExcutor(); WorkflowBuilder workflowBuilder = new WorkflowBuilder(upperCaseExcutor)//开始 .AddEdge(upperCaseExcutor, lowerCaseExcutor)// 边 大写 --》小写 .WithOutputFrom(lowerCaseExcutor);// 最终输出 小写 Workflow workflow = workflowBuilder.Build(); // var run2 = await InProcessExecution.RunAsync(workflow, "hello,how are you"); var run = await InProcessExecution.RunStreamingAsync(workflow, "hello,how are you"); await foreach (WorkflowEvent evt in run.WatchStreamAsync()) { if (evt is WorkflowOutputEvent workflowOutput) { //输出所有事件 Console.WriteLine(evt); Console.WriteLine($"{workflowOutput.ExecutorId}:{workflowOutput.Data}"); MessageBox.Show(workflowOutput.Data.ToString()+"-------"); } } } public static async void Test3AI() { AIChatClient aIChatClient = new AIChatClient(); var ai= aIChatClient.AIAgent("你是一个简单的Ai","customAI"); WorkflowBuilder workflowBuilder = new WorkflowBuilder(ai)//开始 .WithOutputFrom(ai);// 最终输出 小写 Workflow workflow = workflowBuilder.Build(); // var run2 = await InProcessExecution.RunAsync(workflow, "hello,how are you"); var run = await InProcessExecution.RunStreamingAsync(workflow, "hello,how are you"); await run.TrySendMessageAsync(new TurnToken(emitEvents: true)); StringBuilder sb = new StringBuilder(); await foreach (WorkflowEvent evt in run.WatchStreamAsync()) { //输出所有事件 Console.WriteLine(evt); if (evt is WorkflowOutputEvent workflowOutput) { Console.WriteLine($"{workflowOutput.ExecutorId}:{workflowOutput.Data}"); if (!string.IsNullOrEmpty(workflowOutput.Data.ToString())) { sb.AppendLine(workflowOutput.Data.ToString()); } // MessageBox.Show(workflowOutput.Data.ToString() + "-------"); } } string sb222 = sb.ToString(); MessageBox.Show(sb.ToString()); } public static async void Test4AIMulitEdge() { AIChatClient aIChatClient = new AIChatClient(); var ai = aIChatClient.AIAgent("你是一个简单的Ai", "customAI"); AIToLowerExcutor aIToLowerExcutor = new AIToLowerExcutor(); WorkflowBuilder workflowBuilder = new WorkflowBuilder(ai)//开始 .AddEdge(ai, aIToLowerExcutor) .WithOutputFrom(aIToLowerExcutor);// 最终输出 小写 Workflow workflow = workflowBuilder.Build(); // var run2 = await InProcessExecution.RunAsync(workflow, "hello,how are you"); var run = await InProcessExecution.RunStreamingAsync(workflow, "Hello,How Are You"); await run.TrySendMessageAsync(new TurnToken(emitEvents: true));//如果流式,必须出发这个条件,Agent才会输出 StringBuilder sb = new StringBuilder(); await foreach (WorkflowEvent evt in run.WatchStreamAsync()) { //输出所有事件 Console.WriteLine(evt); if (evt is WorkflowOutputEvent workflowOutput) { Console.WriteLine($"{workflowOutput.ExecutorId}:{workflowOutput.Data}"); if (!string.IsNullOrEmpty(workflowOutput.Data.ToString())) { sb.AppendLine(workflowOutput.Data.ToString()); } // MessageBox.Show(workflowOutput.Data.ToString() + "-------"); } } string sb222 = sb.ToString(); MessageBox.Show(sb.ToString()); } }

浙公网安备 33010602011771号