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());
      }


  }

 

 

   

 

posted @ 2026-08-08 11:55  陌念  阅读(1)  评论(0)    收藏  举报