diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Settings/AgentSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Settings/AgentSettings.cs
index 887c437ec..69e4752b2 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Agents/Settings/AgentSettings.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Settings/AgentSettings.cs
@@ -10,6 +10,10 @@ public class AgentSettings
///
/// This is the default LLM config for agent
///
- public AgentLlmConfig LlmConfig { get; set; }
- = new AgentLlmConfig();
+ public AgentLlmConfig LlmConfig { get; set; } = new AgentLlmConfig();
+
+ ///
+ /// General coding settings
+ ///
+ public CodingSettings Coding { get; set; } = new CodingSettings();
}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Coding/Enums/BuiltInCodeProcessor.cs b/src/Infrastructure/BotSharp.Abstraction/Coding/Enums/BuiltInCodeProcessor.cs
new file mode 100644
index 000000000..cdbf76a99
--- /dev/null
+++ b/src/Infrastructure/BotSharp.Abstraction/Coding/Enums/BuiltInCodeProcessor.cs
@@ -0,0 +1,6 @@
+namespace BotSharp.Abstraction.Coding.Enums;
+
+public static class BuiltInCodeProcessor
+{
+ public const string PyInterpreter = "botsharp-py-interpreter";
+}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Coding/Options/CodeGenerationOptions.cs b/src/Infrastructure/BotSharp.Abstraction/Coding/Options/CodeGenerationOptions.cs
index be6437041..de886f5ef 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Coding/Options/CodeGenerationOptions.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Coding/Options/CodeGenerationOptions.cs
@@ -17,11 +17,10 @@ public class CodeGenerationOptions : LlmConfigBase
public string? TemplateName { get; set; }
///
- /// The programming language
+ /// Programming language
///
- [JsonPropertyName("language")]
- [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public string? Language { get; set; } = "python";
+ [JsonPropertyName("programming_language")]
+ public string? ProgrammingLanguage { get; set; }
///
/// Data that can be used to fill in the prompt
diff --git a/src/Infrastructure/BotSharp.Abstraction/Coding/Settings/CodingSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Coding/Settings/CodingSettings.cs
new file mode 100644
index 000000000..5f194bf32
--- /dev/null
+++ b/src/Infrastructure/BotSharp.Abstraction/Coding/Settings/CodingSettings.cs
@@ -0,0 +1,14 @@
+namespace BotSharp.Abstraction.Coding.Settings;
+
+public class CodingSettings
+{
+ ///
+ /// Llm provider to generate code script
+ ///
+ public string? Provider { get; set; }
+
+ ///
+ /// Llm model to generate code script
+ ///
+ public string? Model { get; set; }
+}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleEngine.cs b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleEngine.cs
index c870f145f..51c80d349 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleEngine.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleEngine.cs
@@ -2,5 +2,14 @@ namespace BotSharp.Abstraction.Rules;
public interface IRuleEngine
{
- Task> Triggered(IRuleTrigger trigger, string data, List? states = null);
+ ///
+ /// Trigger the rule that is subscribed by agents.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task> Trigger(IRuleTrigger trigger, string text, RuleTriggerOptions? options = null)
+ => throw new NotImplementedException();
}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs
index 7b6c9bc25..4a58027f4 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs
@@ -1,3 +1,5 @@
+using System.Text.Json;
+
namespace BotSharp.Abstraction.Rules;
public interface IRuleTrigger
@@ -9,4 +11,9 @@ public interface IRuleTrigger
string EntityType { get; set; }
string EntityId { get; set; }
+
+ ///
+ /// The default arguments as input to code trigger (display purpose)
+ ///
+ JsonDocument OutputArgs => JsonDocument.Parse("{}");
}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Rules/Options/RuleTriggerOptions.cs b/src/Infrastructure/BotSharp.Abstraction/Rules/Options/RuleTriggerOptions.cs
new file mode 100644
index 000000000..ef0e3c393
--- /dev/null
+++ b/src/Infrastructure/BotSharp.Abstraction/Rules/Options/RuleTriggerOptions.cs
@@ -0,0 +1,31 @@
+using System.Text.Json;
+
+namespace BotSharp.Abstraction.Rules.Options;
+
+public class RuleTriggerOptions
+{
+ ///
+ /// Code processor provider
+ ///
+ public string? CodeProcessor { get; set; }
+
+ ///
+ /// Code script name
+ ///
+ public string? CodeScriptName { get; set; }
+
+ ///
+ /// Argument name as an input key to the code script
+ ///
+ public string? ArgsName { get; set; }
+
+ ///
+ /// Json arguments as an input value to the code script
+ ///
+ public JsonDocument? Arguments { get; set; }
+
+ ///
+ /// States
+ ///
+ public List? States { get; set; } = null;
+}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Using.cs b/src/Infrastructure/BotSharp.Abstraction/Using.cs
index d20775375..ca0cbe7f7 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Using.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Using.cs
@@ -21,4 +21,6 @@
global using BotSharp.Abstraction.Knowledges.Models;
global using BotSharp.Abstraction.Crontab.Models;
global using BotSharp.Abstraction.MCP.Models;
-global using BotSharp.Abstraction.Settings;
\ No newline at end of file
+global using BotSharp.Abstraction.Settings;
+global using BotSharp.Abstraction.Rules.Options;
+global using BotSharp.Abstraction.Coding.Settings;
\ No newline at end of file
diff --git a/src/Infrastructure/BotSharp.Core.Rules/Engines/RuleEngine.cs b/src/Infrastructure/BotSharp.Core.Rules/Engines/RuleEngine.cs
index 1b3006663..64dd8c2b6 100644
--- a/src/Infrastructure/BotSharp.Core.Rules/Engines/RuleEngine.cs
+++ b/src/Infrastructure/BotSharp.Core.Rules/Engines/RuleEngine.cs
@@ -1,25 +1,33 @@
+using BotSharp.Abstraction.Coding;
+using BotSharp.Abstraction.Coding.Enums;
using BotSharp.Abstraction.Conversations;
using BotSharp.Abstraction.Models;
using BotSharp.Abstraction.Repositories.Filters;
+using BotSharp.Abstraction.Rules.Options;
using BotSharp.Abstraction.Utilities;
using Microsoft.Extensions.Logging;
using System.Data;
+using System.Text.Json;
namespace BotSharp.Core.Rules.Engines;
public class RuleEngine : IRuleEngine
{
private readonly IServiceProvider _services;
- private readonly ILogger _logger;
+ private readonly ILogger _logger;
- public RuleEngine(IServiceProvider services, ILogger logger)
+ public RuleEngine(
+ IServiceProvider services,
+ ILogger logger)
{
_services = services;
_logger = logger;
}
- public async Task> Triggered(IRuleTrigger trigger, string data, List? states = null)
+ public async Task> Trigger(IRuleTrigger trigger, string text, RuleTriggerOptions? options = null)
{
+ var newConversationIds = new List();
+
// Pull all user defined rules
var agentService = _services.GetRequiredService();
var agents = await agentService.GetAgents(new AgentFilter
@@ -30,34 +38,41 @@ public async Task> Triggered(IRuleTrigger trigger, string da
}
});
- var preFilteredAgents = agents.Items.Where(x =>
- x.Rules.Exists(r => r.TriggerName == trigger.Name &&
- !x.Disabled)).ToList();
+ // Trigger agents
+ var filteredAgents = agents.Items.Where(x => x.Rules.Exists(r => r.TriggerName == trigger.Name && !x.Disabled)).ToList();
+ foreach (var agent in filteredAgents)
+ {
+ var isTriggered = true;
- // Trigger the agents
- var instructService = _services.GetRequiredService();
- var newConversationIds = new List();
+ // Code trigger
+ if (options != null)
+ {
+ isTriggered = await TriggerCodeScript(agent.Id, trigger.Name, options);
+ }
+
+ if (!isTriggered)
+ {
+ continue;
+ }
- foreach (var agent in preFilteredAgents)
- {
var convService = _services.GetRequiredService();
var conv = await convService.NewConversation(new Conversation
{
Channel = trigger.Channel,
- Title = data,
+ Title = text,
AgentId = agent.Id
});
- var message = new RoleDialogModel(AgentRole.User, data);
+ var message = new RoleDialogModel(AgentRole.User, text);
var allStates = new List
{
new("channel", trigger.Channel)
};
- if (states != null)
+ if (options?.States != null)
{
- allStates.AddRange(states);
+ allStates.AddRange(options.States);
}
convService.SetConversationId(conv.Id, allStates);
@@ -69,27 +84,84 @@ await convService.SendMessage(agent.Id,
convService.SaveStates();
newConversationIds.Add(conv.Id);
+ }
+
+ return newConversationIds;
+ }
+
+ #region Private methods
+ private async Task TriggerCodeScript(string agentId, string triggerName, RuleTriggerOptions options)
+ {
+ if (string.IsNullOrWhiteSpace(agentId))
+ {
+ return false;
+ }
+
+ var provider = options.CodeProcessor ?? BuiltInCodeProcessor.PyInterpreter;
+ var processor = _services.GetServices().FirstOrDefault(x => x.Provider.IsEqualTo(provider));
+ if (processor == null)
+ {
+ _logger.LogWarning($"Unable to find code processor: {provider}.");
+ return false;
+ }
+
+ var agentService = _services.GetRequiredService();
+ var scriptName = options.CodeScriptName ?? $"{triggerName}_rule.py";
+ var codeScript = await agentService.GetAgentCodeScript(agentId, scriptName, scriptType: AgentCodeScriptType.Src);
- /*foreach (var rule in agent.Rules)
+ var msg = $"rule trigger ({triggerName}) code script ({scriptName}) in agent ({agentId}) => args: {options.Arguments?.RootElement.GetRawText()}.";
+
+ if (string.IsNullOrWhiteSpace(codeScript))
+ {
+ _logger.LogWarning($"Unable to find {msg}.");
+ return false;
+ }
+
+ try
+ {
+ var response = await processor.RunAsync(codeScript, options: new()
+ {
+ ScriptName = scriptName,
+ Arguments = BuildArguments(options.ArgsName, options.Arguments)
+ });
+
+ if (response == null || !response.Success)
+ {
+ _logger.LogWarning($"Failed to handle {msg}");
+ return false;
+ }
+
+ bool result;
+ LogLevel logLevel;
+ if (response.Result.IsEqualTo("true") || response.Result.IsEqualTo("1"))
{
- var userSay = $"===Input data with Before and After values===\r\n{data}\r\n\r\n===Trigger Criteria===\r\n{rule.Criteria}\r\n\r\nJust output 1 or 0 without explanation: ";
-
- var result = await instructService.Execute(BuiltInAgentId.RulesInterpreter, new RoleDialogModel(AgentRole.User, userSay), "criteria_check", "#TEMPLATE#");
-
- // Check if meet the criteria
- if (result.Text == "1")
- {
- // Hit rule
- _logger.LogInformation($"Hit rule {rule.TriggerName} {rule.EntityType} {rule.EventName}, {data}");
-
- await convService.SendMessage(agent.Id,
- new RoleDialogModel(AgentRole.User, $"The conversation was triggered by {rule.Criteria}"),
- null,
- msg => Task.CompletedTask);
- }
- }*/
+ logLevel = LogLevel.Information;
+ result = true;
+ }
+ else
+ {
+ logLevel = LogLevel.Warning;
+ result = false;
+ }
+
+ _logger.Log(logLevel, $"Code script execution result ({response.Result}) from {msg}");
+ return result;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, $"Error when handling {msg}");
+ return false;
}
+ }
- return newConversationIds;
+ private IEnumerable BuildArguments(string? argName, JsonDocument? args)
+ {
+ var keyValues = new List();
+ if (args != null)
+ {
+ keyValues.Add(new KeyValue(argName ?? "rule_args", args.RootElement.GetRawText()));
+ }
+ return keyValues;
}
+#endregion
}
diff --git a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs
index 449db38da..575385455 100644
--- a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs
+++ b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs
@@ -5,7 +5,6 @@
using BotSharp.Abstraction.Templating;
using BotSharp.Abstraction.Users.Enums;
using BotSharp.Core.Agents.Hooks;
-using BotSharp.Core.Coding;
using Microsoft.Extensions.Configuration;
namespace BotSharp.Core.Agents;
@@ -49,8 +48,6 @@ public void RegisterDI(IServiceCollection services, IConfiguration config)
render.RegisterType(typeof(AgentSettings));
return settingService.Bind("Agent");
});
-
- services.AddSingleton();
}
public bool AttachMenu(List menu)
diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Coding.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Coding.cs
index aee641c8c..9f6777d0f 100644
--- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Coding.cs
+++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Coding.cs
@@ -1,5 +1,6 @@
using BotSharp.Abstraction.Agents.Options;
using BotSharp.Abstraction.Coding;
+using BotSharp.Abstraction.Coding.Enums;
using BotSharp.Abstraction.Coding.Options;
namespace BotSharp.Core.Agents.Services;
@@ -76,7 +77,7 @@ public async Task GenerateCodeScript(string agentId, strin
};
}
- var processor = options?.Processor ?? "botsharp-py-interpreter";
+ var processor = options?.Processor ?? BuiltInCodeProcessor.PyInterpreter;
var codeProcessor = _services.GetServices().FirstOrDefault(x => x.Provider.IsEqualTo(processor));
if (codeProcessor == null)
{
diff --git a/src/Infrastructure/BotSharp.Core/Coding/CodingPlugin.cs b/src/Infrastructure/BotSharp.Core/Coding/CodingPlugin.cs
new file mode 100644
index 000000000..4f788f996
--- /dev/null
+++ b/src/Infrastructure/BotSharp.Core/Coding/CodingPlugin.cs
@@ -0,0 +1,15 @@
+using Microsoft.Extensions.Configuration;
+
+namespace BotSharp.Core.Coding;
+
+public class CodingPlugin : IBotSharpPlugin
+{
+ public string Id => "31bc334b-9462-4191-beac-cb4a139b78c1";
+ public string Name => "Coding";
+ public string Description => "Handling execution and generation of code scripts";
+
+ public void RegisterDI(IServiceCollection services, IConfiguration config)
+ {
+ services.AddSingleton();
+ }
+}
diff --git a/src/Infrastructure/BotSharp.Core/Instructs/Services/InstructService.Execute.cs b/src/Infrastructure/BotSharp.Core/Instructs/Services/InstructService.Execute.cs
index 8960ecf63..56a006dab 100644
--- a/src/Infrastructure/BotSharp.Core/Instructs/Services/InstructService.Execute.cs
+++ b/src/Infrastructure/BotSharp.Core/Instructs/Services/InstructService.Execute.cs
@@ -1,4 +1,5 @@
using BotSharp.Abstraction.Coding;
+using BotSharp.Abstraction.Coding.Enums;
using BotSharp.Abstraction.Files.Options;
using BotSharp.Abstraction.Files.Proccessors;
using BotSharp.Abstraction.Instructs;
@@ -179,7 +180,7 @@ await hook.OnResponseGenerated(new InstructResponseModel
var state = _services.GetRequiredService();
var hooks = _services.GetHooks(agent.Id);
- var codeProvider = codeOptions?.Processor ?? "botsharp-py-interpreter";
+ var codeProvider = codeOptions?.Processor ?? BuiltInCodeProcessor.PyInterpreter;
var codeProcessor = _services.GetServices()
.FirstOrDefault(x => x.Provider.IsEqualTo(codeProvider));
diff --git a/src/Infrastructure/BotSharp.Core/Using.cs b/src/Infrastructure/BotSharp.Core/Using.cs
index de3fa1e78..39ac00cc8 100644
--- a/src/Infrastructure/BotSharp.Core/Using.cs
+++ b/src/Infrastructure/BotSharp.Core/Using.cs
@@ -6,6 +6,7 @@
global using BotSharp.Abstraction.Conversations.Models;
global using BotSharp.Abstraction.Conversations.Settings;
global using BotSharp.Abstraction.Coding.Models;
+global using BotSharp.Abstraction.Coding.Settings;
global using BotSharp.Abstraction.Crontab.Models;
global using BotSharp.Abstraction.Files;
global using BotSharp.Abstraction.Files.Enums;
diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Coding.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Coding.cs
index 55c3381bb..40800d35c 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Coding.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Coding.cs
@@ -61,7 +61,8 @@ public async Task GenerateAgentCodeScript([FromRoute] stri
var states = request.Options?.Data?.ToList();
var state = _services.GetRequiredService();
states?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
- state.SetState("programming_language", request.Options?.Language, source: StateSource.External);
+ state.SetState("code_processor", request.Options?.Processor, source: StateSource.External);
+ state.SetState("programming_language", request.Options?.ProgrammingLanguage, source: StateSource.External);
var result = await _agentService.GenerateCodeScript(agentId, request.Text, request?.Options);
return result;
diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs
index 4daefc717..5feddec47 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs
@@ -6,12 +6,13 @@ namespace BotSharp.OpenAPI.Controllers;
public partial class AgentController
{
[HttpGet("/rule/triggers")]
- public IEnumerable GetRuleTriggers()
+ public IEnumerable GetRuleTriggers()
{
var triggers = _services.GetServices();
- return triggers.Select(x => new AgentRule
+ return triggers.Select(x => new AgentRuleViewModel
{
- TriggerName = x.GetType().Name
+ TriggerName = x.GetType().Name,
+ OutputArgs = x.OutputArgs
}).OrderBy(x => x.TriggerName).ToList();
}
diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Conversation/GoogleController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Application/GoogleController.cs
similarity index 93%
rename from src/Infrastructure/BotSharp.OpenAPI/Controllers/Conversation/GoogleController.cs
rename to src/Infrastructure/BotSharp.OpenAPI/Controllers/Application/GoogleController.cs
index 13faeb2d1..5497d6c2e 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Conversation/GoogleController.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Application/GoogleController.cs
@@ -11,15 +11,18 @@ public class GoogleController : ControllerBase
private readonly IServiceProvider _services;
private readonly BotSharpOptions _options;
private readonly IHttpClientFactory _httpClientFactory;
- private readonly ILogger _logger;
+ private readonly ILogger _logger;
- public GoogleController(IServiceProvider services,
+ public GoogleController(
+ IServiceProvider services,
+ ILogger logger,
IHttpClientFactory httpClientFactory,
BotSharpOptions options)
{
_services = services;
- _options = options;
+ _logger = logger;
_httpClientFactory = httpClientFactory;
+ _options = options;
}
[HttpGet("/address/options")]
diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/View/AgentRuleViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/View/AgentRuleViewModel.cs
new file mode 100644
index 000000000..6297a6733
--- /dev/null
+++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/View/AgentRuleViewModel.cs
@@ -0,0 +1,29 @@
+using System.Text.Json.Serialization;
+
+namespace BotSharp.OpenAPI.ViewModels.Agents;
+
+public class AgentRuleViewModel
+{
+ [JsonPropertyName("trigger_name")]
+ public string TriggerName { get; set; } = string.Empty;
+
+ [JsonPropertyName("output_args")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public JsonDocument? OutputArgs { get; set; }
+
+ [JsonPropertyName("json_args")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public string? JsonArgs
+ {
+ get
+ {
+ if (OutputArgs == null)
+ {
+ return null;
+ }
+
+ var json = JsonSerializer.Serialize(OutputArgs.RootElement, new JsonSerializerOptions { WriteIndented = true });
+ return $"```json\r\n{json}\r\n```";
+ }
+ }
+}
diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Services/PyCodeInterpreter.cs b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Services/PyCodeInterpreter.cs
index 8ee5d536a..9e03b2aae 100644
--- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Services/PyCodeInterpreter.cs
+++ b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Services/PyCodeInterpreter.cs
@@ -1,4 +1,3 @@
-using BotSharp.Abstraction.Coding.Models;
using Microsoft.Extensions.Logging;
using Python.Runtime;
using System.Threading;
@@ -11,18 +10,21 @@ public class PyCodeInterpreter : ICodeProcessor
private readonly IServiceProvider _services;
private readonly ILogger _logger;
private readonly CodeScriptExecutor _executor;
+ private readonly AgentSettings _agentSettings;
public PyCodeInterpreter(
IServiceProvider services,
ILogger logger,
- CodeScriptExecutor executor)
+ CodeScriptExecutor executor,
+ AgentSettings agentSettings)
{
_services = services;
_logger = logger;
_executor = executor;
+ _agentSettings = agentSettings;
}
- public string Provider => "botsharp-py-interpreter";
+ public string Provider => BuiltInCodeProcessor.PyInterpreter;
public async Task RunAsync(string codeScript, CodeInterpretOptions? options = null)
{
@@ -42,10 +44,10 @@ public async Task GenerateCodeScriptAsync(string text, Cod
var agentId = options?.AgentId;
var templateName = options?.TemplateName;
-
- var agentService = _services.GetRequiredService();
+
if (!string.IsNullOrEmpty(agentId))
{
+ var agentService = _services.GetRequiredService();
agent = await agentService.GetAgent(agentId);
}
@@ -55,6 +57,7 @@ public async Task GenerateCodeScriptAsync(string text, Cod
instruction = agent.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(templateName))?.Content;
}
+ var (provider, model) = GetLlmProviderModel();
var innerAgent = new Agent
{
Id = agent?.Id ?? BuiltInAgentId.AIProgrammer,
@@ -62,8 +65,8 @@ public async Task GenerateCodeScriptAsync(string text, Cod
Instruction = instruction,
LlmConfig = new AgentLlmConfig
{
- Provider = options?.Provider ?? "openai",
- Model = options?.Model ?? "gpt-5-mini",
+ Provider = options?.Provider ?? provider,
+ Model = options?.Model ?? model,
MaxOutputTokens = options?.MaxOutputTokens,
ReasoningEffortLevel = options?.ReasoningEffortLevel
},
@@ -84,7 +87,7 @@ public async Task GenerateCodeScriptAsync(string text, Cod
{
Success = true,
Content = response.Content,
- Language = options?.Language ?? "python"
+ Language = options?.ProgrammingLanguage ?? "python"
};
}
@@ -179,5 +182,21 @@ private CodeInterpretResponse CoreRun(string codeScript, CodeInterpretOptions? o
}
}
}
+
+ private (string, string) GetLlmProviderModel()
+ {
+ var provider = _agentSettings.Coding?.Provider;
+ var model = _agentSettings.Coding?.Model;
+
+ if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
+ {
+ return (provider, model);
+ }
+
+ provider = "openai";
+ model = "gpt-5-mini";
+
+ return (provider, model);
+ }
#endregion
}
diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Using.cs b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Using.cs
index bd2c943b7..9296406a3 100644
--- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Using.cs
+++ b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Using.cs
@@ -21,6 +21,9 @@
global using BotSharp.Abstraction.Messaging.Models.RichContent.Template;
global using BotSharp.Abstraction.Routing;
global using BotSharp.Abstraction.Coding;
+global using BotSharp.Abstraction.Coding.Enums;
+global using BotSharp.Abstraction.Coding.Models;
+global using BotSharp.Abstraction.Coding.Settings;
global using BotSharp.Abstraction.Coding.Options;
global using BotSharp.Abstraction.Coding.Responses;
global using BotSharp.Core.Coding;
diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json
index 071b279a5..e97678903 100644
--- a/src/WebStarter/appsettings.json
+++ b/src/WebStarter/appsettings.json
@@ -468,6 +468,10 @@
"LlmConfig": {
"Provider": "openai",
"Model": "gpt-4.1-nano"
+ },
+ "Coding": {
+ "Provider": "openai",
+ "Model": "gpt-5-mini"
}
},