Merge branch 'SciSharp:master' into master

This commit is contained in:
Haiping 2024-11-07 00:31:07 +00:00 committed by GitHub
commit 68d444a541
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 64 additions and 46 deletions

View file

@ -30,6 +30,8 @@ public class PageActionArgs
/// </summary>
public string[]? IncludeResponseUrls { get; set; }
public List<string>? Selectors { get; set; }
/// <summary>
/// If set to true, the response will be stored in memory
/// </summary>

View file

@ -3,5 +3,6 @@ namespace BotSharp.Abstraction.Plugins.Models
public class PluginFilter
{
public Pagination Pager { get; set; } = new Pagination();
public IEnumerable<string>? Names { get; set; }
}
}

View file

@ -40,12 +40,25 @@ public class SideCarAspect
return typeof(SideCarAspect).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static);
}
private object CallAsyncMethod(IServiceProvider serviceProvider, Type retType, string methodName, Func<object[], object> target, object[] args)
private (IConversationSideCar?, MethodInfo?) GetSideCarMethod(IServiceProvider serviceProvider, string methodName, object[] args)
{
var sidecar = serviceProvider.GetService<IConversationSideCar>();
var sidecarMethod = sidecar?.GetType()?.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance);
var argTypes = args.Select(x => x.GetType()).ToArray();
var sidecarMethod = sidecar?.GetType()?.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(x => x.Name == methodName
&& x.GetParameters().Length == argTypes.Length
&& x.GetParameters().Select(p => p.ParameterType)
.Zip(argTypes, (paramType, argType) => paramType.IsAssignableFrom(argType)).All(y => y));
return (sidecar, sidecarMethod);
}
private object CallAsyncMethod(IServiceProvider serviceProvider, Type retType, string methodName, Func<object[], object> target, object[] args)
{
object value;
var (sidecar, sidecarMethod) = GetSideCarMethod(serviceProvider, methodName, args);
var enabled = sidecar != null && sidecar.IsEnabled() && sidecarMethod != null;
if (retType == typeof(void))
@ -77,11 +90,10 @@ public class SideCarAspect
private object CallSyncMethod(IServiceProvider serviceProvider, Type retType, string methodName, Func<object[], object> target, object[] args)
{
var sidecar = serviceProvider.GetService<IConversationSideCar>();
var sidecarMethod = sidecar?.GetType()?.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance);
object value;
var enabled = sidecar != null && sidecarMethod != null && sidecar.IsEnabled();
var (sidecar, sidecarMethod) = GetSideCarMethod(serviceProvider, methodName, args);
var enabled = sidecar != null && sidecar.IsEnabled() && sidecarMethod != null;
if (retType == typeof(void))
{

View file

@ -126,6 +126,12 @@ public class PluginLoader
var plugins = GetPlugins(services);
var pager = filter?.Pager ?? new Pagination();
// Apply filter
if (!filter.Names.IsNullOrEmpty())
{
plugins = plugins.Where(x => filter.Names.Any(n => x.Name.IsEqualTo(n))).ToList();
}
return new PagedItems<PluginDef>
{
Items = plugins.Skip(pager.Offset).Take(pager.Size),

View file

@ -64,18 +64,13 @@ public class HandleExcelRequestFn : IFunctionCallback
message.Content = "No excel files found in the conversation";
return true;
}
if (!DeleteTable())
{
message.Content = "Failed to clear existing tables. Please manually delete all existing tables";
}
else
{
var resultList = GetResponeFromDialogs(dialogs);
var states = _serviceProvider.GetRequiredService<IConversationStateService>();
message.Content = GenerateSqlExecutionSummary(resultList);
states.SetState("excel_import_result",message.Content);
}
var resultList = GetResponeFromDialogs(dialogs);
var states = _serviceProvider.GetRequiredService<IConversationStateService>();
message.Content = GenerateSqlExecutionSummary(resultList);
states.SetState("excel_import_result",message.Content);
return true;
}
@ -122,28 +117,12 @@ public class HandleExcelRequestFn : IFunctionCallback
var bytes = _fileStorage.GetFileBytes(file.FileStorageUrl);
var workbook = ConvertToWorkBook(bytes);
//var dbService = CreateDbService(DbServiceType.MySql);
var currentCommandList = _mySqlService.WriteExcelDataToDB(workbook);
sqlCommandList.AddRange(currentCommandList);
}
return sqlCommandList;
}
private bool DeleteTable()
{
try
{
//_mySqlService.DeleteTableSqlQuery();
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to delete table");
return false;
}
}
private string GenerateSqlExecutionSummary(List<SqlContextOut> messageList)
{
var stringBuilder = new StringBuilder();

View file

@ -31,13 +31,6 @@ namespace BotSharp.Plugin.ExcelHandler.Services
{
try
{
/*using var mySqlDbConnection = _mySqlDbHelpers.GetDbConnection();
var tableNames = GetAllTableSchema(mySqlDbConnection);
if (tableNames.IsNullOrEmpty())
{
return true;
}*/
return true;
}
catch (Exception ex)
@ -232,7 +225,7 @@ namespace BotSharp.Plugin.ExcelHandler.Services
_columnTypes?.Insert(0, "INT UNSIGNED AUTO_INCREMENT");
}*/
var createTableSql = $"CREATE TABLE if not exists {tableName} ( \n";
var createTableSql = $"DROP TABLE IF EXISTS {tableName}; CREATE TABLE if not exists {tableName} ( \n";
createTableSql += string.Join(", \n", headerColumns.Select((x, i) => $"`{x}` {_columnTypes[i]}"));
var indexSql = string.Join(", \n", headerColumns.Select(x => $"KEY `idx_{tableName}_{x}` (`{x}`)"));
createTableSql += $", \n{indexSql}\n);";

View file

@ -1,5 +1,6 @@
using BotSharp.Abstraction.Plugins.Models;
using BotSharp.Abstraction.Settings;
using BotSharp.Abstraction.Users.Enums;
using BotSharp.Plugin.KnowledgeBase.Converters;
using BotSharp.Plugin.KnowledgeBase.Hooks;
using BotSharp.Plugin.KnowledgeBase.Services;
@ -25,7 +26,6 @@ public class KnowledgeBasePlugin : IBotSharpPlugin
services.AddSingleton<IPdf2TextConverter, PigPdf2TextConverter>();
services.AddScoped<IAgentUtilityHook, KnowledgeBaseUtilityHook>();
services.AddScoped<IAgentHook, KnowledgeBaseAgentHook>();
services.AddScoped<IKnowledgeService, KnowledgeService>();
}
@ -34,6 +34,7 @@ public class KnowledgeBasePlugin : IBotSharpPlugin
var section = menu.First(x => x.Label == "Apps");
menu.Add(new PluginMenuDef("Knowledge Base", icon: "bx bx-book-open", weight: section.Weight + 1)
{
Roles = new List<string> { UserRole.Root, UserRole.Admin },
SubMenu = new List<PluginMenuDef>
{
new PluginMenuDef("Q & A", link: "page/knowledge-base/question-answer"),

View file

@ -78,7 +78,7 @@ public class VerifyDictionaryTerm : IFunctionCallback
var render = _services.GetRequiredService<ITemplateRender>();
var knowledgeHooks = _services.GetServices<IKnowledgeHook>();
var agent = await agentService.GetAgent(BuiltInAgentId.Planner);
var agent = await agentService.GetAgent(BuiltInAgentId.SqlDriver);
var template = agent.Templates.FirstOrDefault(x => x.Name == "database.dictionary.sql")?.Content ?? string.Empty;
var responseFormat = JsonSerializer.Serialize(new LookupDictionary{ });

View file

@ -7,7 +7,7 @@ namespace BotSharp.Plugin.SqlDriver.Hooks;
public class SqlDictionaryLookupHook : AgentHookBase, IAgentHook
{
private const string SQL_EXECUTOR_TEMPLATE = "sql_dictionary_lookup.fn";
private const string SQL_EXECUTOR_TEMPLATE = "verify_dictionary_term.fn";
private IEnumerable<string> _targetSqlExecutorFunctions = new List<string>
{
"verify_dictionary_term",

View file

@ -1,3 +1,5 @@
using Microsoft.Playwright;
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
public partial class PlaywrightWebDriver
@ -47,15 +49,37 @@ public partial class PlaywrightWebDriver
var response = await page.GotoAsync(args.Url, new PageGotoOptions
{
Timeout = args.Timeout
Timeout = args.Timeout > 0 ? args.Timeout : 30000
});
if (args.Selectors != null)
{
// 使用传入的选择器列表进行并行等待
var tasks =args.Selectors.Select(selector =>
page.WaitForSelectorAsync(selector, new PageWaitForSelectorOptions
{
Timeout = args.Timeout > 0 ? args.Timeout : 30000
})
).ToArray();
await Task.WhenAll(tasks);
// 在此处提取所有选择器的 HTML 内容
var contentTasks = args.Selectors.Select(selector => page.InnerHTMLAsync(selector)).ToArray();
var contents = await Task.WhenAll(contentTasks);
result.IsSuccess = true;
result.Body = string.Join(", ", contents.Select((content, index) => $"{args.Selectors[index]}: {content}"));
return result;
}
await page.WaitForLoadStateAsync(LoadState.DOMContentLoaded);
if (args.WaitForNetworkIdle)
{
await page.WaitForLoadStateAsync(LoadState.NetworkIdle, new PageWaitForLoadStateOptions
{
Timeout = args.Timeout
Timeout = args.Timeout > 0 ? args.Timeout : 30000
});
}