From 463a82911eadbea53d71841e9663f14b7c8265c5 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Fri, 28 Mar 2025 10:40:10 -0500 Subject: [PATCH 1/2] Fix compile issue --- src/Infrastructure/BotSharp.MCP/Hooks/MCPToolAgentHook.cs | 4 ++-- src/Infrastructure/BotSharp.MCP/McpPlugin.cs | 4 ++-- .../BotSharp.OpenAPI/Controllers/AgentController.cs | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Infrastructure/BotSharp.MCP/Hooks/MCPToolAgentHook.cs b/src/Infrastructure/BotSharp.MCP/Hooks/MCPToolAgentHook.cs index 84039cfb..bac79cd4 100644 --- a/src/Infrastructure/BotSharp.MCP/Hooks/MCPToolAgentHook.cs +++ b/src/Infrastructure/BotSharp.MCP/Hooks/MCPToolAgentHook.cs @@ -55,13 +55,13 @@ public class MCPToolAgentHook : AgentHookBase var mcpClient = await mcpClientManager.GetMcpClientAsync(item.ServerId); if (mcpClient != null) { - var tools = await mcpClient.ListToolsAsync().ToListAsync(); + /*var tools = await mcpClient.ListToolsAsync().ToListAsync(); var toolnames = item.Functions.Select(x => x.Name).ToList(); foreach (var tool in tools.Where(x => toolnames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))) { var funDef = AIFunctionUtilities.MapToFunctionDef(tool); functionDefs.Add(funDef); - } + }*/ } } diff --git a/src/Infrastructure/BotSharp.MCP/McpPlugin.cs b/src/Infrastructure/BotSharp.MCP/McpPlugin.cs index f95965ac..f85dc951 100644 --- a/src/Infrastructure/BotSharp.MCP/McpPlugin.cs +++ b/src/Infrastructure/BotSharp.MCP/McpPlugin.cs @@ -45,7 +45,7 @@ public class McpPlugin : IBotSharpPlugin private async Task RegisterFunctionCall(IServiceCollection services, McpServerConfig server) { var client = await clientManager.GetMcpClientAsync(server.Id); - var tools = await client.ListToolsAsync().ToListAsync(); + /*var tools = await client.ListToolsAsync().ToListAsync(); foreach (var tool in tools) { @@ -56,6 +56,6 @@ public class McpPlugin : IBotSharpPlugin var funcTool = new McpToolAdapter(provider, tool, clientManager); return funcTool; }); - } + }*/ } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs index 6e49658d..61530b15 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs @@ -178,10 +178,11 @@ public class AgentController : ControllerBase public async Task> GetMCPTools(string serverId) { var client = await _clientManager.GetMcpClientAsync(serverId); - var tools = await client.ListToolsAsync().ToListAsync(); + throw new NotImplementedException(); + /*var tools = await client.ListToolsAsync().ToListAsync(); return tools.Where(x => !string.IsNullOrWhiteSpace(x.Name)) - .OrderBy(x => x.Name).ToList(); + .OrderBy(x => x.Name).ToList();*/ } [HttpGet("/agent/labels")] From 2a6463b13207e276968d48760ea0c08508ff4b3b Mon Sep 17 00:00:00 2001 From: Visagan Guruparan <103048@smsassist.com> Date: Fri, 28 Mar 2025 11:32:41 -0500 Subject: [PATCH 2/2] Initial commit for NC-4754 --- .../Browsing/Enums/BroswerActionEnum.cs | 4 +- .../Browsing/Models/ElementActionArgs.cs | 2 + .../PlaywrightWebDriver.DoAction.cs | 46 ++++++++++++++++++- .../functions/util-web-action_on_element.json | 10 +++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs index abdfd67b..4efa1448 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs @@ -7,5 +7,7 @@ public enum BroswerActionEnum Typing = 3, Hover = 4, Scroll = 5, - DragAndDrop = 6 + DragAndDrop = 6, + DropDown = 7, + FileUpload = 8 } diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs index 8885feb3..869186b1 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs @@ -12,6 +12,8 @@ public class ElementActionArgs [JsonPropertyName("content")] public string? Content { get; set; } + [JsonPropertyName("file_urls")] + public string[] FileUrl { get; set; } public ElementPosition? Position { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs index b851cd1a..865864a0 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs @@ -1,3 +1,6 @@ +using System.IO; +using System.Net.Http; + namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; public partial class PlaywrightWebDriver @@ -50,6 +53,18 @@ public partial class PlaywrightWebDriver }); } } + else if (action.Action == BroswerActionEnum.DropDown) + { + await locator.ClickAsync(); + var optionLocator = page.Locator($"//div[text()='{action.Content}']"); + var optionCount = await optionLocator.CountAsync(); ; + if (optionCount == 0) + { + Serilog.Log.Error($"Dropdown option not found: {action.Content}"); + return; + } + await optionLocator.First.ClickAsync(); + } else if (action.Action == BroswerActionEnum.InputText) { await locator.FillAsync(action.Content); @@ -63,6 +78,36 @@ public partial class PlaywrightWebDriver await locator.PressAsync(action.PressKey); } } + else if (action.Action == BroswerActionEnum.FileUpload) + { + if (action.FileUrl.Length == 0) + { + return; + } + var fileChooser = await page.RunAndWaitForFileChooserAsync(async () => + { + await locator.ClickAsync(); + }); + var guid = Guid.NewGuid().ToString(); + var directory = Path.Combine(Path.GetTempPath(), guid); + if (Directory.Exists(directory)) + { + Directory.Delete(directory, true); + } + Directory.CreateDirectory(directory); + var localPaths = new List(); + using var httpClient = new HttpClient(); + foreach (var fileUrl in action.FileUrl) + { + var bytes = await httpClient.GetByteArrayAsync(fileUrl); + var fileName = new Uri(fileUrl).AbsolutePath; + var localPath = Path.Combine(directory, Path.GetFileName(fileName)); + await File.WriteAllBytesAsync(localPath, bytes); + await Task.Delay(2000); + localPaths.Add(localPath); + } + await fileChooser.SetFilesAsync(localPaths); + } else if (action.Action == BroswerActionEnum.Typing) { await locator.PressSequentiallyAsync(action.Content); @@ -128,7 +173,6 @@ public partial class PlaywrightWebDriver await Task.Delay(1000 * action.WaitTime); } } - public static List GetVelocityTrack(float distance) { // Initialize the track list to store the movement distances diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json b/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json index f91425b4..b397fc49 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json +++ b/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json @@ -11,12 +11,20 @@ "action": { "type": "string", "description": "action to perform on element", - "enum": [ "Click", "InputText" ] + "enum": [ "Click", "InputText", "DropDown", "FileUpload" ] }, "content": { "type": "string", "description": "content to input in element" }, + "file_urls": { + "type": "array", + "description": "The output format must be string array of file urls.", + "items": { + "type": "string", + "description": "file url" + } + }, "press_key": { "type": "string", "enum": [ "Enter" ],