python interpreter
This commit is contained in:
parent
2be4dd3053
commit
30f3de9bc4
14
BotSharp.sln
14
BotSharp.sln
|
|
@ -105,6 +105,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FileStorages", "FileStorage
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.TencentCos", "src\Plugins\BotSharp.Plugin.TencentCos\BotSharp.Plugin.TencentCos.csproj", "{BF029B0A-768B-43A1-8D91-E70B95505716}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.TencentCos", "src\Plugins\BotSharp.Plugin.TencentCos\BotSharp.Plugin.TencentCos.csproj", "{BF029B0A-768B-43A1-8D91-E70B95505716}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interpreters", "Interpreters", "{C4C59872-3C8A-450D-83D5-2BE402D610D5}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.PythonInterpreter", "src\Plugins\BotSharp.Plugin.PythonInterpreter\BotSharp.Plugin.PythonInterpreter.csproj", "{05E6E405-5021-406E-8A5E-0A7CEC881F6D}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -425,6 +429,14 @@ Global
|
||||||
{BF029B0A-768B-43A1-8D91-E70B95505716}.Release|Any CPU.Build.0 = Release|Any CPU
|
{BF029B0A-768B-43A1-8D91-E70B95505716}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{BF029B0A-768B-43A1-8D91-E70B95505716}.Release|x64.ActiveCfg = Release|Any CPU
|
{BF029B0A-768B-43A1-8D91-E70B95505716}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{BF029B0A-768B-43A1-8D91-E70B95505716}.Release|x64.Build.0 = Release|Any CPU
|
{BF029B0A-768B-43A1-8D91-E70B95505716}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D}.Release|x64.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -475,6 +487,8 @@ Global
|
||||||
{54E83C6F-54EE-4ADC-8D72-93C009CC4FB4} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
|
{54E83C6F-54EE-4ADC-8D72-93C009CC4FB4} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
|
||||||
{38B37C0D-1930-4D47-BCBF-E358EC1096B1} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
|
{38B37C0D-1930-4D47-BCBF-E358EC1096B1} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
|
||||||
{BF029B0A-768B-43A1-8D91-E70B95505716} = {38B37C0D-1930-4D47-BCBF-E358EC1096B1}
|
{BF029B0A-768B-43A1-8D91-E70B95505716} = {38B37C0D-1930-4D47-BCBF-E358EC1096B1}
|
||||||
|
{C4C59872-3C8A-450D-83D5-2BE402D610D5} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
|
||||||
|
{05E6E405-5021-406E-8A5E-0A7CEC881F6D} = {C4C59872-3C8A-450D-83D5-2BE402D610D5}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19}
|
SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace BotSharp.Abstraction.Interpreters.Models;
|
||||||
|
|
||||||
|
public class InterpretationRequest
|
||||||
|
{
|
||||||
|
[JsonPropertyName("script")]
|
||||||
|
public string Script { get; set; } = null!;
|
||||||
|
|
||||||
|
[JsonPropertyName("language")]
|
||||||
|
public string Language { get; set; } = null!;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<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>
|
||||||
|
<None Remove="data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95\functions\python_interpreter.json" />
|
||||||
|
<None Remove="data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95\templates\python_interpreter.fn.liquid" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95\functions\python_interpreter.json">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95\templates\python_interpreter.fn.liquid">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="pythonnet" Version="3.0.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\Infrastructure\BotSharp.Abstraction\BotSharp.Abstraction.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace BotSharp.Plugin.PythonInterpreter.Enums;
|
||||||
|
|
||||||
|
public class UtilityName
|
||||||
|
{
|
||||||
|
public const string PythonInterpreter = "python-interpreter";
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
using BotSharp.Abstraction.Conversations.Models;
|
||||||
|
using BotSharp.Abstraction.Functions;
|
||||||
|
using BotSharp.Abstraction.Interpreters.Models;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Python.Runtime;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace BotSharp.Plugin.PythonInterpreter.Functions;
|
||||||
|
|
||||||
|
public class InterpretationFn : IFunctionCallback
|
||||||
|
{
|
||||||
|
public string Name => "python_interpreter";
|
||||||
|
public string Indication => "Interpreting python code";
|
||||||
|
|
||||||
|
private readonly IServiceProvider _services;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
public async Task<bool> Execute(RoleDialogModel message)
|
||||||
|
{
|
||||||
|
var args = JsonSerializer.Deserialize<InterpretationRequest>(message.FunctionArgs);
|
||||||
|
|
||||||
|
using (Py.GIL())
|
||||||
|
{
|
||||||
|
// Import necessary Python modules
|
||||||
|
dynamic sys = Py.Import("sys");
|
||||||
|
dynamic io = Py.Import("io");
|
||||||
|
|
||||||
|
// Redirect standard output to capture it
|
||||||
|
dynamic stringIO = io.StringIO();
|
||||||
|
sys.stdout = stringIO;
|
||||||
|
|
||||||
|
// Execute a simple Python script
|
||||||
|
using var locals = new PyDict();
|
||||||
|
PythonEngine.Exec(args.Script, null, locals);
|
||||||
|
|
||||||
|
// Console.WriteLine($"Result from Python: {result}");
|
||||||
|
message.Content = stringIO.getvalue();
|
||||||
|
|
||||||
|
// Restore the original stdout
|
||||||
|
sys.stdout = sys.__stdout__;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
namespace BotSharp.Plugin.PythonInterpreter.Hooks;
|
||||||
|
|
||||||
|
public class InterpreterAgentHook : AgentHookBase
|
||||||
|
{
|
||||||
|
private static string FUNCTION_NAME = "python_interpreter";
|
||||||
|
|
||||||
|
public override string SelfId => string.Empty;
|
||||||
|
|
||||||
|
public InterpreterAgentHook(IServiceProvider services, AgentSettings settings)
|
||||||
|
: base(services, settings)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public override void OnAgentLoaded(Agent agent)
|
||||||
|
{
|
||||||
|
var conv = _services.GetRequiredService<IConversationService>();
|
||||||
|
var isConvMode = conv.IsConversationMode();
|
||||||
|
var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.PythonInterpreter);
|
||||||
|
|
||||||
|
if (isConvMode && isEnabled)
|
||||||
|
{
|
||||||
|
var (prompt, fn) = GetPromptAndFunction();
|
||||||
|
if (fn != null)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(prompt))
|
||||||
|
{
|
||||||
|
agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (agent.Functions == null)
|
||||||
|
{
|
||||||
|
agent.Functions = new List<FunctionDef> { fn };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
agent.Functions.Add(fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base.OnAgentLoaded(agent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private (string, FunctionDef?) GetPromptAndFunction()
|
||||||
|
{
|
||||||
|
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||||
|
var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant);
|
||||||
|
var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{FUNCTION_NAME}.fn"))?.Content ?? string.Empty;
|
||||||
|
var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(FUNCTION_NAME));
|
||||||
|
return (prompt, loadAttachmentFn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace BotSharp.Plugin.PythonInterpreter.Hooks;
|
||||||
|
|
||||||
|
public class InterpreterUtilityHook : IAgentUtilityHook
|
||||||
|
{
|
||||||
|
public void AddUtilities(List<string> utilities)
|
||||||
|
{
|
||||||
|
utilities.Add(UtilityName.PythonInterpreter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
using BotSharp.Plugin.PythonInterpreter.Hooks;
|
||||||
|
|
||||||
|
namespace BotSharp.Plugin.PythonInterpreter;
|
||||||
|
|
||||||
|
public class InterpreterPlugin : IBotSharpPlugin
|
||||||
|
{
|
||||||
|
public string Id => "23174e08-e866-4173-824a-cf1d97afa8d0";
|
||||||
|
public string Name => "Python Interpreter";
|
||||||
|
public string Description => "Python Interpreter enables AI to write and execute Python code within a secure, sandboxed environment.";
|
||||||
|
public string? IconUrl => "https://static.vecteezy.com/system/resources/previews/012/697/295/non_2x/3d-python-programming-language-logo-free-png.png";
|
||||||
|
|
||||||
|
public void RegisterDI(IServiceCollection services, IConfiguration config)
|
||||||
|
{
|
||||||
|
services.AddScoped<IAgentHook, InterpreterAgentHook>();
|
||||||
|
services.AddScoped<IAgentUtilityHook, InterpreterUtilityHook>();
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/Plugins/BotSharp.Plugin.PythonInterpreter/Using.cs
Normal file
18
src/Plugins/BotSharp.Plugin.PythonInterpreter/Using.cs
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
global using System;
|
||||||
|
global using System.Linq;
|
||||||
|
global using System.Collections.Generic;
|
||||||
|
|
||||||
|
global using Microsoft.Extensions.Configuration;
|
||||||
|
global using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
global using BotSharp.Abstraction.Agents;
|
||||||
|
global using BotSharp.Abstraction.Plugins;
|
||||||
|
global using BotSharp.Abstraction.Utilities;
|
||||||
|
global using BotSharp.Abstraction.Agents.Enums;
|
||||||
|
global using BotSharp.Abstraction.Agents.Models;
|
||||||
|
global using BotSharp.Abstraction.Agents.Settings;
|
||||||
|
global using BotSharp.Abstraction.Conversations;
|
||||||
|
global using BotSharp.Abstraction.Functions.Models;
|
||||||
|
global using BotSharp.Abstraction.Repositories;
|
||||||
|
|
||||||
|
global using BotSharp.Plugin.PythonInterpreter.Enums;
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "python_interpreter",
|
||||||
|
"description": "write and execute python code, print the result in Console",
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"script": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "python code"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [ "python" ],
|
||||||
|
"description": "python code"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [ "language", "script" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Write and execute Python script in python_interpreter function, and use python function print(a) to output the result in stand output.
|
||||||
|
|
@ -4,6 +4,7 @@ using BotSharp.Logger;
|
||||||
using BotSharp.Plugin.ChatHub;
|
using BotSharp.Plugin.ChatHub;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using BotSharp.Abstraction.Messaging.JsonConverters;
|
using BotSharp.Abstraction.Messaging.JsonConverters;
|
||||||
|
using Python.Runtime;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
|
@ -41,4 +42,11 @@ app.UseBotSharp()
|
||||||
.UseBotSharpOpenAPI(app.Environment)
|
.UseBotSharpOpenAPI(app.Environment)
|
||||||
.UseBotSharpUI();
|
.UseBotSharpUI();
|
||||||
|
|
||||||
|
Runtime.PythonDLL = @"C:\Users\xxx\AppData\Local\Programs\Python\Python311\python311.dll";
|
||||||
|
PythonEngine.Initialize();
|
||||||
|
PythonEngine.BeginAllowThreads();
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
|
|
||||||
|
// Shut down the Python engine
|
||||||
|
PythonEngine.Shutdown();
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
<ProjectReference Include="..\Plugins\BotSharp.Plugin.Dashboard\BotSharp.Plugin.Dashboard.csproj" />
|
<ProjectReference Include="..\Plugins\BotSharp.Plugin.Dashboard\BotSharp.Plugin.Dashboard.csproj" />
|
||||||
<ProjectReference Include="..\Plugins\BotSharp.Plugin.MetaGLM\BotSharp.Plugin.MetaGLM.csproj" />
|
<ProjectReference Include="..\Plugins\BotSharp.Plugin.MetaGLM\BotSharp.Plugin.MetaGLM.csproj" />
|
||||||
<ProjectReference Include="..\Plugins\BotSharp.Plugin.Planner\BotSharp.Plugin.Planner.csproj" />
|
<ProjectReference Include="..\Plugins\BotSharp.Plugin.Planner\BotSharp.Plugin.Planner.csproj" />
|
||||||
|
<ProjectReference Include="..\Plugins\BotSharp.Plugin.PythonInterpreter\BotSharp.Plugin.PythonInterpreter.csproj" />
|
||||||
<ProjectReference Include="..\Plugins\BotSharp.Plugin.SparkDesk\BotSharp.Plugin.SparkDesk.csproj" />
|
<ProjectReference Include="..\Plugins\BotSharp.Plugin.SparkDesk\BotSharp.Plugin.SparkDesk.csproj" />
|
||||||
<ProjectReference Include="..\Plugins\BotSharp.Plugin.TencentCos\BotSharp.Plugin.TencentCos.csproj" />
|
<ProjectReference Include="..\Plugins\BotSharp.Plugin.TencentCos\BotSharp.Plugin.TencentCos.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,8 @@
|
||||||
"BotSharp.Plugin.HttpHandler",
|
"BotSharp.Plugin.HttpHandler",
|
||||||
"BotSharp.Plugin.FileHandler",
|
"BotSharp.Plugin.FileHandler",
|
||||||
"BotSharp.Plugin.EmailHandler",
|
"BotSharp.Plugin.EmailHandler",
|
||||||
"BotSharp.Plugin.TencentCos"
|
"BotSharp.Plugin.TencentCos",
|
||||||
|
"BotSharp.Plugin.PythonInterpreter"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue