Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace BotSharp.Abstraction.Instructs.Settings;

public class InstructionSettings
{
public bool EnableLog { get; set; }
}
6 changes: 3 additions & 3 deletions src/Infrastructure/BotSharp.Abstraction/Models/KeyValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand All @@ -17,7 +17,7 @@ public override string ToString()
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; }
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,66 @@ public PagedItems<InstructionLogModel> GetInstructionLogs(InstructLogFilter filt
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);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using BotSharp.Abstraction.Instructs.Models;
using BotSharp.Abstraction.Instructs.Settings;
using BotSharp.Abstraction.Loggers.Models;
using BotSharp.Abstraction.Users;

Expand All @@ -24,7 +25,8 @@ public InstructionLogHook(

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>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ public PagedItems<Conversation> GetConversations(ConversationFilter filter)
}

// Filter states
if (filter != null && string.IsNullOrEmpty(filter.Id) && !filter.States.IsNullOrEmpty())
if (filter != null && !filter.States.IsNullOrEmpty())
{
foreach (var pair in filter.States)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,28 +152,72 @@ public PagedItems<InstructionLogModel> GetInstructionLogs(InstructLogFilter filt
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);
Expand Down
4 changes: 4 additions & 0 deletions src/WebStarter/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,10 @@
"Enabled": false
},

"Instruction": {
"EnableLog": true
},

"ChatHub": {
"EventDispatchBy": "group"
},
Expand Down
Loading