Merge pull request #926 from iceljc/master
add instruction log setting and state search
This commit is contained in:
commit
a006f6a9c3
|
|
@ -7,6 +7,7 @@ public class InstructLogFilter : Pagination
|
|||
public List<string>? Models { get; set; }
|
||||
public List<string>? TemplateNames { get; set; }
|
||||
public List<string>? UserIds { get; set; }
|
||||
public List<KeyValue>? States { get; set; }
|
||||
|
||||
public static InstructLogFilter Empty()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
namespace BotSharp.Abstraction.Instructs.Settings;
|
||||
|
||||
public class InstructionSettings
|
||||
{
|
||||
public bool EnableLog { get; set; }
|
||||
}
|
||||
|
|
@ -3,10 +3,10 @@ namespace BotSharp.Abstraction.Models;
|
|||
public class KeyValue
|
||||
{
|
||||
[JsonPropertyName("key")]
|
||||
public string Key { get; set; }
|
||||
public string Key { get; set; } = string.Empty;
|
||||
|
||||
[JsonPropertyName("value")]
|
||||
public string Value { get; set; }
|
||||
public string? Value { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
|
|
@ -17,7 +17,7 @@ public class KeyValue
|
|||
public class KeyValue<T>
|
||||
{
|
||||
[JsonPropertyName("key")]
|
||||
public string Key { get; set; }
|
||||
public string Key { get; set; } = string.Empty;
|
||||
|
||||
[JsonPropertyName("value")]
|
||||
public T? Value { get; set; }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
using BotSharp.Abstraction.Instructs.Settings;
|
||||
using BotSharp.Abstraction.Plugins.Models;
|
||||
using BotSharp.Abstraction.Settings;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace BotSharp.Core.Instructs;
|
||||
|
|
@ -11,7 +13,11 @@ public class InsturctionPlugin : IBotSharpPlugin
|
|||
|
||||
public void RegisterDI(IServiceCollection services, IConfiguration config)
|
||||
{
|
||||
|
||||
services.AddScoped(provider =>
|
||||
{
|
||||
var settingService = provider.GetRequiredService<ISettingService>();
|
||||
return settingService.Bind<InstructionSettings>("Instruction");
|
||||
});
|
||||
}
|
||||
|
||||
public bool AttachMenu(List<PluginMenuDef> menu)
|
||||
|
|
|
|||
|
|
@ -187,6 +187,66 @@ namespace BotSharp.Core.Repository
|
|||
matched = matched && filter.UserIds.Contains(log.UserId);
|
||||
}
|
||||
|
||||
// Check states
|
||||
if (matched && filter != null && !filter.States.IsNullOrEmpty())
|
||||
{
|
||||
var logStates = log.InnerStates;
|
||||
if (logStates.IsNullOrEmpty())
|
||||
{
|
||||
matched = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var pair in filter.States)
|
||||
{
|
||||
if (pair == null || string.IsNullOrWhiteSpace(pair.Key)) continue;
|
||||
|
||||
var components = pair.Key.Split(".").ToList();
|
||||
var primaryKey = components[0];
|
||||
if (logStates.TryGetValue(primaryKey, out var doc))
|
||||
{
|
||||
var elem = doc.RootElement.GetProperty("data");
|
||||
if (components.Count < 2)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(pair.Value))
|
||||
{
|
||||
if (elem.ValueKind == JsonValueKind.Null)
|
||||
{
|
||||
matched = false;
|
||||
}
|
||||
else if (elem.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
matched = elem.EnumerateArray().Where(x => x.ValueKind != JsonValueKind.Null)
|
||||
.Select(x => x.ToString())
|
||||
.Any(x => x == pair.Value);
|
||||
}
|
||||
else if (elem.ValueKind == JsonValueKind.String)
|
||||
{
|
||||
matched = elem.GetString() == pair.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
matched = elem.GetRawText() == pair.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var paths = components.Where((_, idx) => idx > 0);
|
||||
var found = FindState(elem, paths, pair.Value);
|
||||
matched = found != null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
matched = false;
|
||||
}
|
||||
|
||||
if (!matched) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!matched) continue;
|
||||
|
||||
log.Id = Path.GetFileNameWithoutExtension(file);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using BotSharp.Abstraction.Instructs.Models;
|
||||
using BotSharp.Abstraction.Instructs.Settings;
|
||||
using BotSharp.Abstraction.Loggers.Models;
|
||||
using BotSharp.Abstraction.Users;
|
||||
|
||||
|
|
@ -24,7 +25,8 @@ public class InstructionLogHook : InstructHookBase
|
|||
|
||||
public override async Task OnResponseGenerated(InstructResponseModel response)
|
||||
{
|
||||
if (response == null) return;
|
||||
var settings = _services.GetRequiredService<InstructionSettings>();
|
||||
if (!settings.EnableLog || response == null) return;
|
||||
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
var state = _services.GetRequiredService<IConversationStateService>();
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@ public partial class MongoRepository
|
|||
}
|
||||
|
||||
// Filter states
|
||||
if (filter != null && string.IsNullOrEmpty(filter.Id) && !filter.States.IsNullOrEmpty())
|
||||
if (filter != null && !filter.States.IsNullOrEmpty())
|
||||
{
|
||||
foreach (var pair in filter.States)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -152,28 +152,72 @@ public partial class MongoRepository
|
|||
filter = InstructLogFilter.Empty();
|
||||
}
|
||||
|
||||
var builder = Builders<InstructionLogDocument>.Filter;
|
||||
var filters = new List<FilterDefinition<InstructionLogDocument>>() { builder.Empty };
|
||||
var logBuilder = Builders<InstructionLogDocument>.Filter;
|
||||
var logFilters = new List<FilterDefinition<InstructionLogDocument>>() { logBuilder.Empty };
|
||||
|
||||
// Filter logs
|
||||
if (!filter.AgentIds.IsNullOrEmpty())
|
||||
{
|
||||
filters.Add(builder.In(x => x.AgentId, filter.AgentIds));
|
||||
logFilters.Add(logBuilder.In(x => x.AgentId, filter.AgentIds));
|
||||
}
|
||||
if (!filter.Providers.IsNullOrEmpty())
|
||||
{
|
||||
filters.Add(builder.In(x => x.Provider, filter.Providers));
|
||||
logFilters.Add(logBuilder.In(x => x.Provider, filter.Providers));
|
||||
}
|
||||
if (!filter.Models.IsNullOrEmpty())
|
||||
{
|
||||
filters.Add(builder.In(x => x.Model, filter.Models));
|
||||
logFilters.Add(logBuilder.In(x => x.Model, filter.Models));
|
||||
}
|
||||
if (!filter.TemplateNames.IsNullOrEmpty())
|
||||
{
|
||||
filters.Add(builder.In(x => x.TemplateName, filter.TemplateNames));
|
||||
logFilters.Add(logBuilder.In(x => x.TemplateName, filter.TemplateNames));
|
||||
}
|
||||
|
||||
var filterDef = builder.And(filters);
|
||||
// Filter states
|
||||
if (filter != null && !filter.States.IsNullOrEmpty())
|
||||
{
|
||||
foreach (var pair in filter.States)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(pair.Key)) continue;
|
||||
|
||||
// Format key
|
||||
var keys = pair.Key.Split(".").ToList();
|
||||
keys.Insert(1, "data");
|
||||
keys.Insert(0, "States");
|
||||
var formattedKey = string.Join(".", keys);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(pair.Value))
|
||||
{
|
||||
logFilters.Add(logBuilder.Exists(formattedKey));
|
||||
}
|
||||
else if (bool.TryParse(pair.Value, out var boolValue))
|
||||
{
|
||||
logFilters.Add(logBuilder.Eq(formattedKey, boolValue));
|
||||
}
|
||||
else if (int.TryParse(pair.Value, out var intValue))
|
||||
{
|
||||
logFilters.Add(logBuilder.Eq(formattedKey, intValue));
|
||||
}
|
||||
else if (decimal.TryParse(pair.Value, out var decimalValue))
|
||||
{
|
||||
logFilters.Add(logBuilder.Eq(formattedKey, decimalValue));
|
||||
}
|
||||
else if (float.TryParse(pair.Value, out var floatValue))
|
||||
{
|
||||
logFilters.Add(logBuilder.Eq(formattedKey, floatValue));
|
||||
}
|
||||
else if (double.TryParse(pair.Value, out var doubleValue))
|
||||
{
|
||||
logFilters.Add(logBuilder.Eq(formattedKey, doubleValue));
|
||||
}
|
||||
else
|
||||
{
|
||||
logFilters.Add(logBuilder.Eq(formattedKey, pair.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var filterDef = logBuilder.And(logFilters);
|
||||
var sortDef = Builders<InstructionLogDocument>.Sort.Descending(x => x.CreatedTime);
|
||||
var docs = _dc.InstructionLogs.Find(filterDef).Sort(sortDef).Skip(filter.Offset).Limit(filter.Size).ToList();
|
||||
var count = _dc.InstructionLogs.CountDocuments(filterDef);
|
||||
|
|
|
|||
|
|
@ -222,6 +222,10 @@
|
|||
"Enabled": false
|
||||
},
|
||||
|
||||
"Instruction": {
|
||||
"EnableLog": true
|
||||
},
|
||||
|
||||
"ChatHub": {
|
||||
"EventDispatchBy": "group"
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in a new issue