Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions BotSharp.sln
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.LLM.Tests", "tests
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Test.RealtimeVoice", "tests\BotSharp.Test.RealtimeVoice\BotSharp.Test.RealtimeVoice.csproj", "{B067B126-88CD-4282-BEEF-7369B64423EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.Sandbox.Tests", "tests\BotSharp.Plugin.Sandbox.Tests\BotSharp.Plugin.Sandbox.Tests.csproj", "{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.ChartHandler", "src\Plugins\BotSharp.Plugin.ChartHandler\BotSharp.Plugin.ChartHandler.csproj", "{0428DEAA-E4FE-4259-A6D8-6EDD1A9D0702}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.ExcelHandler", "src\Plugins\BotSharp.Plugin.ExcelHandler\BotSharp.Plugin.ExcelHandler.csproj", "{FC63C875-E880-D8BB-B8B5-978AB7B62983}"
Expand All @@ -151,6 +153,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.ImageHandle
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.FuzzySharp", "src\Plugins\BotSharp.Plugin.FuzzySharp\BotSharp.Plugin.FuzzySharp.csproj", "{E7C243B9-E751-B3B4-8F16-95C76CA90D31}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.Sandbox", "src\Plugins\BotSharp.Plugin.Sandbox\BotSharp.Plugin.Sandbox.csproj", "{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.MMPEmbedding", "src\Plugins\BotSharp.Plugin.MMPEmbedding\BotSharp.Plugin.MMPEmbedding.csproj", "{394B858B-9C26-B977-A2DA-8CC7BE5914CB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.Membase", "src\Plugins\BotSharp.Plugin.Membase\BotSharp.Plugin.Membase.csproj", "{13223C71-9EAC-9835-28ED-5A4833E6F915}"
Expand Down Expand Up @@ -643,6 +647,22 @@ Global
{E7C243B9-E751-B3B4-8F16-95C76CA90D31}.Release|Any CPU.Build.0 = Release|Any CPU
{E7C243B9-E751-B3B4-8F16-95C76CA90D31}.Release|x64.ActiveCfg = Release|Any CPU
{E7C243B9-E751-B3B4-8F16-95C76CA90D31}.Release|x64.Build.0 = Release|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Debug|x64.ActiveCfg = Debug|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Debug|x64.Build.0 = Debug|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Release|Any CPU.Build.0 = Release|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Release|x64.ActiveCfg = Release|Any CPU
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4}.Release|x64.Build.0 = Release|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Debug|x64.ActiveCfg = Debug|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Debug|x64.Build.0 = Debug|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Release|Any CPU.Build.0 = Release|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Release|x64.ActiveCfg = Release|Any CPU
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C}.Release|x64.Build.0 = Release|Any CPU
{394B858B-9C26-B977-A2DA-8CC7BE5914CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{394B858B-9C26-B977-A2DA-8CC7BE5914CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{394B858B-9C26-B977-A2DA-8CC7BE5914CB}.Debug|x64.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -721,6 +741,7 @@ Global
{AF329442-B48E-4B48-A18A-1C869D1BA6F5} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
{781F1465-365C-0F22-1775-25025DAFA4C7} = {E29DC6C4-5E57-48C5-BCB0-6B8F84782749}
{8D2AD45F-836A-516F-DE6A-71443CEBB18A} = {32FAFFFE-A4CB-4FEE-BF7C-84518BBC6DCC}
{B5DF4E3B-2B1F-4A96-8E5D-93B5FA1B2E9C} = {32FAFFFE-A4CB-4FEE-BF7C-84518BBC6DCC}
{C19D9AC1-97DD-8E65-E8DB-D295A095AA2D} = {32FAFFFE-A4CB-4FEE-BF7C-84518BBC6DCC}
{B268E2F0-060F-8466-7D81-ABA4D735CA59} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
{970BE341-9AC8-99A5-6572-E703C1E02FCB} = {E29DC6C4-5E57-48C5-BCB0-6B8F84782749}
Expand All @@ -732,6 +753,7 @@ Global
{50B57066-3267-1D10-0F72-D2F5CC494F2C} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
{242F2D93-FCCE-4982-8075-F3052ECCA92C} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
{E7C243B9-E751-B3B4-8F16-95C76CA90D31} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
{6F2E7F85-20E7-4A24-8B6E-B50D1779FAC4} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
{394B858B-9C26-B977-A2DA-8CC7BE5914CB} = {4F346DCE-087F-4368-AF88-EE9C720D0E69}
{13223C71-9EAC-9835-28ED-5A4833E6F915} = {53E7CD86-0D19-40D9-A0FA-AB4613837E89}
EndGlobalSection
Expand Down
5 changes: 3 additions & 2 deletions dockerfiles/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@
"BotSharp.Plugin.WeChat",
"BotSharp.Plugin.PizzaBot",
"BotSharp.Plugin.WebDriver",
"BotSharp.Plugin.LLamaSharp"
"BotSharp.Plugin.LLamaSharp",
"BotSharp.Plugin.Sandbox"
]
}
}
}
23 changes: 23 additions & 0 deletions src/Plugins/BotSharp.Plugin.Sandbox/BotSharp.Plugin.Sandbox.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>$(TargetFramework)</TargetFramework>
<Nullable>enable</Nullable>
<LangVersion>$(LangVersion)</LangVersion>
<VersionPrefix>$(BotSharpVersion)</VersionPrefix>
<GeneratePackageOnBuild>$(GeneratePackageOnBuild)</GeneratePackageOnBuild>
<GenerateDocumentationFile>$(GenerateDocumentationFile)</GenerateDocumentationFile>
<OutputPath>$(SolutionDir)packages</OutputPath>
</PropertyGroup>

<ItemGroup>
<Content Include="data\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Infrastructure\BotSharp.Core\BotSharp.Core.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxBrowserScreenshotFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.BrowserScreenshot;
public string Indication => "Capturing sandbox browser screenshot.";

private readonly SandboxApiClient _client;

public SandboxBrowserScreenshotFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/browser/screenshot", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxCheckPackagesFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.CheckPackages;
public string Indication => "Checking installed sandbox packages.";

private readonly SandboxApiClient _client;

public SandboxCheckPackagesFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
var lang = SandboxPayloadHelper.ReadString(message.FunctionArgs, "lang");
var endpoint = "/v1/sandbox/packages";
if (!string.IsNullOrWhiteSpace(lang))
{
endpoint = $"{endpoint}/{Uri.EscapeDataString(lang)}";
}

message.Content = await _client.GetAsync(endpoint);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxFileEditorFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.FileEditor;
public string Indication => "Applying structured file edits in sandbox.";

private readonly SandboxApiClient _client;

public SandboxFileEditorFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/file/str_replace_editor", message.FunctionArgs);
return true;
}
}
20 changes: 20 additions & 0 deletions src/Plugins/BotSharp.Plugin.Sandbox/Functions/SandboxFileListFn.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxFileListFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.FileList;
public string Indication => "Listing sandbox directory content.";

private readonly SandboxApiClient _client;

public SandboxFileListFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/file/list", message.FunctionArgs);
return true;
}
}
20 changes: 20 additions & 0 deletions src/Plugins/BotSharp.Plugin.Sandbox/Functions/SandboxFileReadFn.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxFileReadFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.FileRead;
public string Indication => "Reading file content from sandbox.";

private readonly SandboxApiClient _client;

public SandboxFileReadFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/file/read", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxFileSearchFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.FileSearch;
public string Indication => "Searching text inside sandbox files.";

private readonly SandboxApiClient _client;

public SandboxFileSearchFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/file/search", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxFileWriteFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.FileWrite;
public string Indication => "Writing file content inside sandbox.";

private readonly SandboxApiClient _client;

public SandboxFileWriteFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/file/write", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxGetContextFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.GetContext;
public string Indication => "Inspecting sandbox environment.";

private readonly SandboxApiClient _client;

public SandboxGetContextFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.GetAsync("/v1/sandbox");
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxJupyterCreateSessionFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.JupyterCreateSession;
public string Indication => "Creating sandbox Jupyter session.";

private readonly SandboxApiClient _client;

public SandboxJupyterCreateSessionFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/jupyter/sessions/create", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxJupyterExecFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.JupyterExec;
public string Indication => "Running code via sandbox Jupyter runtime.";

private readonly SandboxApiClient _client;

public SandboxJupyterExecFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/jupyter/execute", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxShellExecFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.ShellExec;
public string Indication => "Executing shell command inside the sandbox.";

private readonly SandboxApiClient _client;

public SandboxShellExecFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/shell/exec", message.FunctionArgs);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace BotSharp.Plugin.Sandbox.Functions;

public class SandboxShellWaitFn : IFunctionCallback
{
public string Name => SandboxFunctionNames.ShellWait;
public string Indication => "Waiting for sandbox shell task completion.";

private readonly SandboxApiClient _client;

public SandboxShellWaitFn(SandboxApiClient client)
{
_client = client;
}

public async Task<bool> Execute(RoleDialogModel message)
{
message.Content = await _client.PostAsync("/v1/shell/wait", message.FunctionArgs);
return true;
}
}
30 changes: 30 additions & 0 deletions src/Plugins/BotSharp.Plugin.Sandbox/Hooks/SandboxUtilityHook.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
namespace BotSharp.Plugin.Sandbox.Hooks;

public class SandboxUtilityHook : IAgentUtilityHook
{
public void AddUtilities(List<AgentUtility> utilities)
{
var items = new List<UtilityItem>
{
new() { FunctionName = SandboxFunctionNames.GetContext },
new() { FunctionName = SandboxFunctionNames.ShellExec },
new() { FunctionName = SandboxFunctionNames.ShellWait },
new() { FunctionName = SandboxFunctionNames.FileRead },
new() { FunctionName = SandboxFunctionNames.FileWrite },
new() { FunctionName = SandboxFunctionNames.FileList },
new() { FunctionName = SandboxFunctionNames.FileSearch },
new() { FunctionName = SandboxFunctionNames.FileEditor },
new() { FunctionName = SandboxFunctionNames.BrowserScreenshot },
new() { FunctionName = SandboxFunctionNames.JupyterExec },
new() { FunctionName = SandboxFunctionNames.JupyterCreateSession },
new() { FunctionName = SandboxFunctionNames.CheckPackages }
};

utilities.Add(new AgentUtility
{
Category = "sandbox",
Name = "aio_sandbox",
Items = items
});
}
}
Loading