refine side car
This commit is contained in:
parent
71ce4251c7
commit
43882b52bc
11
BotSharp.sln
11
BotSharp.sln
|
|
@ -117,6 +117,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.Graph", "sr
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.AudioHandler", "src\Plugins\BotSharp.Plugin.AudioHandler\BotSharp.Plugin.AudioHandler.csproj", "{F57F4862-F8D4-44A1-AC12-5C131B5C9785}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Core.SideCar", "src\Infrastructure\BotSharp.Core.SideCar\BotSharp.Core.SideCar.csproj", "{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
|
@ -469,6 +471,14 @@ Global
|
|||
{F57F4862-F8D4-44A1-AC12-5C131B5C9785}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F57F4862-F8D4-44A1-AC12-5C131B5C9785}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{F57F4862-F8D4-44A1-AC12-5C131B5C9785}.Release|x64.Build.0 = Release|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE}.Release|x64.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
@ -525,6 +535,7 @@ Global
|
|||
{97A0B191-64D7-4F8A-BFE8-1BFCC5E247E1} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
|
||||
{EBFE97DA-D0BA-48BA-8B5D-083B60348D1D} = {97A0B191-64D7-4F8A-BFE8-1BFCC5E247E1}
|
||||
{F57F4862-F8D4-44A1-AC12-5C131B5C9785} = {51AFE054-AE99-497D-A593-69BAEFB5106F}
|
||||
{6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE} = {E29DC6C4-5E57-48C5-BCB0-6B8F84782749}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>$(TargetFramework)</TargetFramework>
|
||||
|
|
@ -38,6 +38,7 @@
|
|||
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
||||
<PackageReference Include="Rougamo.Fody" Version="4.0.0" />
|
||||
<PackageReference Include="AspectInjector" Version="2.8.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
using BotSharp.Abstraction.Loggers.Models;
|
||||
using BotSharp.Abstraction.Plugins.Models;
|
||||
using BotSharp.Abstraction.Repositories.Filters;
|
||||
using BotSharp.Abstraction.Shared;
|
||||
using BotSharp.Abstraction.Tasks.Models;
|
||||
using BotSharp.Abstraction.Translation.Models;
|
||||
using BotSharp.Abstraction.Users.Models;
|
||||
|
|
@ -8,7 +9,7 @@ using BotSharp.Abstraction.VectorStorage.Models;
|
|||
|
||||
namespace BotSharp.Abstraction.Repositories;
|
||||
|
||||
public interface IBotSharpRepository
|
||||
public interface IBotSharpRepository : IHaveServiceProvider
|
||||
{
|
||||
#region Plugin
|
||||
PluginConfig GetPluginConfig();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
namespace BotSharp.Abstraction.Shared;
|
||||
|
||||
public interface IHaveServiceProvider
|
||||
{
|
||||
IServiceProvider ServiceProvider { get; }
|
||||
}
|
||||
|
|
@ -0,0 +1,168 @@
|
|||
using AspectInjector.Broker;
|
||||
using BotSharp.Abstraction.Shared;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Reflection;
|
||||
|
||||
namespace BotSharp.Abstraction.SideCar.Attributes;
|
||||
|
||||
[Aspect(Scope.PerInstance)]
|
||||
public class SideCarAspect
|
||||
{
|
||||
[Advice(Kind.Around)]
|
||||
public object Handle(
|
||||
[Argument(Source.Target)] Func<object[], object> target,
|
||||
[Argument(Source.Arguments)] object[] args,
|
||||
[Argument(Source.Instance)] object instance,
|
||||
[Argument(Source.ReturnType)] Type retType,
|
||||
[Argument(Source.Name)] string name,
|
||||
[Argument(Source.Metadata)] MethodBase metaData,
|
||||
[Argument(Source.Triggers)] Attribute[] triggers)
|
||||
{
|
||||
object value;
|
||||
var serviceProvider = ((IHaveServiceProvider)instance).ServiceProvider;
|
||||
|
||||
if (typeof(Task).IsAssignableFrom(retType))
|
||||
{
|
||||
var syncResultType = retType.IsConstructedGenericType ? retType.GenericTypeArguments[0] : typeof(void);
|
||||
value = CallAsyncMethod(serviceProvider, syncResultType, name, target, args);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = CallSyncMethod(serviceProvider, retType, name, target, args);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
private static MethodInfo GetMethod(string name)
|
||||
{
|
||||
return typeof(SideCarAspect).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static);
|
||||
}
|
||||
|
||||
private object CallAsyncMethod(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 && sidecar.IsEnabled() && sidecarMethod != null;
|
||||
|
||||
if (retType == typeof(void))
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
|
||||
value = GetMethod(nameof(CallAsync)).Invoke(this, [sidecar, sidecarMethod, args]);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = GetMethod(nameof(WrapAsync)).Invoke(this, [target, args]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
value = GetMethod(nameof(CallGenericAsync)).MakeGenericMethod(retType).Invoke(this, [sidecar, sidecarMethod, args]);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = GetMethod(nameof(WrapGenericAsync)).MakeGenericMethod(retType).Invoke(this, [target, args]);
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
if (retType == typeof(void))
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
value = GetMethod(nameof(CallSync)).Invoke(this, [sidecar, sidecarMethod, args]);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = GetMethod(nameof(WrapSync)).Invoke(this, [target, args]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
value = GetMethod(nameof(CallGenericSync)).MakeGenericMethod(retType).Invoke(this, [sidecar, sidecarMethod, args]);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = GetMethod(nameof(WrapGenericSync)).MakeGenericMethod(retType).Invoke(this, [target, args]);
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
#region Call Side car method
|
||||
private static async Task<T> CallGenericAsync<T>(object instance, MethodInfo method, object[] args)
|
||||
{
|
||||
var res = await (Task<T>)method.Invoke(instance, args);
|
||||
return res;
|
||||
}
|
||||
|
||||
private static async Task CallAsync(object instance, MethodInfo method, object[] args)
|
||||
{
|
||||
await (Task)method.Invoke(instance, args);
|
||||
return;
|
||||
}
|
||||
|
||||
private static T CallGenericSync<T>(object instance, MethodInfo method, object[] args)
|
||||
{
|
||||
var res = (T)method.Invoke(instance, args);
|
||||
return res;
|
||||
}
|
||||
|
||||
private static void CallSync(object instance, MethodInfo method, object[] args)
|
||||
{
|
||||
method.Invoke(instance, args);
|
||||
return;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region Call original method
|
||||
private static T WrapGenericSync<T>(Func<object[], object> target, object[] args)
|
||||
{
|
||||
T res;
|
||||
res = (T)target(args);
|
||||
return res;
|
||||
}
|
||||
|
||||
private static async Task<T> WrapGenericAsync<T>(Func<object[], object> target, object[] args)
|
||||
{
|
||||
T res;
|
||||
res = await (Task<T>)target(args);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
private static void WrapSync(Func<object[], object> target, object[] args)
|
||||
{
|
||||
target(args);
|
||||
return;
|
||||
}
|
||||
|
||||
private static async Task WrapAsync(Func<object[], object> target, object[] args)
|
||||
{
|
||||
await (Task)target(args);
|
||||
return;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
using AspectInjector.Broker;
|
||||
|
||||
namespace BotSharp.Abstraction.SideCar.Attributes;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method, Inherited = true)]
|
||||
[Injection(typeof(SideCarAspect))]
|
||||
public class SideCarAttribute : Attribute
|
||||
{
|
||||
public SideCarAttribute()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +1,13 @@
|
|||
namespace BotSharp.Abstraction.Conversations;
|
||||
namespace BotSharp.Abstraction.SideCar;
|
||||
|
||||
public interface IConversationSideCar
|
||||
{
|
||||
string Provider { get; }
|
||||
|
||||
bool IsEnabled();
|
||||
void AppendConversationDialogs(string conversationId, List<DialogElement> messages);
|
||||
List<DialogElement> GetConversationDialogs(string conversationId);
|
||||
void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint);
|
||||
ConversationBreakpoint? GetConversationBreakpoint(string conversationId);
|
||||
Task<RoleDialogModel> Execute(string agentId, string text, PostbackMessageModel? postback = null, List<MessageState>? states = null);
|
||||
Task<RoleDialogModel> SendMessage(string agentId, string text, PostbackMessageModel? postback = null, List<MessageState>? states = null);
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>$(TargetFramework)</TargetFramework>
|
||||
<LangVersion>$(LangVersion)</LangVersion>
|
||||
<VersionPrefix>$(BotSharpVersion)</VersionPrefix>
|
||||
<GeneratePackageOnBuild>$(GeneratePackageOnBuild)</GeneratePackageOnBuild>
|
||||
<OutputPath>$(SolutionDir)packages</OutputPath>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\BotSharp.Abstraction\BotSharp.Abstraction.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
using BotSharp.Abstraction.Plugins;
|
||||
using BotSharp.Abstraction.Settings;
|
||||
using BotSharp.Core.SideCar.Services;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace BotSharp.Core.SideCar;
|
||||
|
||||
public class BotSharpSideCarPlugin : IBotSharpPlugin
|
||||
{
|
||||
public string Id => "06e5a276-bba0-45af-9625-889267c341c9";
|
||||
public string Name => "Side car";
|
||||
public string Description => "Provides side car for calling agent cluster in conversation";
|
||||
|
||||
public SettingsMeta Settings => new SettingsMeta("SideCar");
|
||||
public object GetNewSettingsInstance() => new SideCarSettings();
|
||||
|
||||
public void RegisterDI(IServiceCollection services, IConfiguration config)
|
||||
{
|
||||
var settings = new SideCarSettings();
|
||||
config.Bind("SideCar", settings);
|
||||
services.AddSingleton(settings);
|
||||
|
||||
if (settings.Conversation.Provider == "botsharp")
|
||||
{
|
||||
services.AddScoped<IConversationSideCar, BotSharpConversationSideCar>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,20 +1,19 @@
|
|||
using BotSharp.Abstraction.Conversations.Enums;
|
||||
using BotSharp.Abstraction.Models;
|
||||
namespace BotSharp.Core.SideCar.Services;
|
||||
|
||||
namespace BotSharp.Core.Conversations.Services;
|
||||
|
||||
public class ConversationSideCar : IConversationSideCar
|
||||
public class BotSharpConversationSideCar : IConversationSideCar
|
||||
{
|
||||
private readonly IServiceProvider _services;
|
||||
private readonly ILogger<ConversationSideCar> _logger;
|
||||
private readonly ILogger<BotSharpConversationSideCar> _logger;
|
||||
|
||||
private Stack<ConversationContext> contextStack = new();
|
||||
|
||||
private bool enabled = false;
|
||||
|
||||
public ConversationSideCar(
|
||||
public string Provider => "botsharp";
|
||||
|
||||
public BotSharpConversationSideCar(
|
||||
IServiceProvider services,
|
||||
ILogger<ConversationSideCar> logger)
|
||||
ILogger<BotSharpConversationSideCar> logger)
|
||||
{
|
||||
_services = services;
|
||||
_logger = logger;
|
||||
|
|
@ -27,60 +26,42 @@ public class ConversationSideCar : IConversationSideCar
|
|||
|
||||
public void AppendConversationDialogs(string conversationId, List<DialogElement> messages)
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
var top = contextStack.Peek();
|
||||
top.Dialogs.AddRange(messages);
|
||||
}
|
||||
else
|
||||
{
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
db.AppendConversationDialogs(conversationId, messages);
|
||||
}
|
||||
if (contextStack.IsNullOrEmpty()) return;
|
||||
|
||||
var top = contextStack.Peek();
|
||||
top.Dialogs.AddRange(messages);
|
||||
}
|
||||
|
||||
public List<DialogElement> GetConversationDialogs(string conversationId)
|
||||
{
|
||||
if (enabled)
|
||||
if (contextStack.IsNullOrEmpty())
|
||||
{
|
||||
return contextStack.Peek().Dialogs;
|
||||
}
|
||||
else
|
||||
{
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
return db.GetConversationDialogs(conversationId);
|
||||
return new List<DialogElement>();
|
||||
}
|
||||
|
||||
return contextStack.Peek().Dialogs;
|
||||
}
|
||||
|
||||
public void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint)
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
var top = contextStack.Peek().Breakpoints;
|
||||
top.Add(breakpoint);
|
||||
}
|
||||
else
|
||||
{
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
db.UpdateConversationBreakpoint(conversationId, breakpoint);
|
||||
}
|
||||
if (contextStack.IsNullOrEmpty()) return;
|
||||
|
||||
var top = contextStack.Peek().Breakpoints;
|
||||
top.Add(breakpoint);
|
||||
}
|
||||
|
||||
public ConversationBreakpoint? GetConversationBreakpoint(string conversationId)
|
||||
{
|
||||
if (enabled)
|
||||
if (contextStack.IsNullOrEmpty())
|
||||
{
|
||||
var top = contextStack.Peek().Breakpoints;
|
||||
return top.LastOrDefault();
|
||||
}
|
||||
else
|
||||
{
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
return db.GetConversationBreakpoint(conversationId);
|
||||
return null;
|
||||
}
|
||||
|
||||
var top = contextStack.Peek().Breakpoints;
|
||||
return top.LastOrDefault();
|
||||
}
|
||||
|
||||
public async Task<RoleDialogModel> Execute(string agentId, string text,
|
||||
public async Task<RoleDialogModel> SendMessage(string agentId, string text,
|
||||
PostbackMessageModel? postback = null, List<MessageState>? states = null)
|
||||
{
|
||||
BeforeExecute();
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
namespace BotSharp.Core.SideCar.Settings;
|
||||
|
||||
public class SideCarSettings
|
||||
{
|
||||
public BaseSetting Conversation { get; set; }
|
||||
}
|
||||
|
||||
public class BaseSetting
|
||||
{
|
||||
public string Provider { get; set; }
|
||||
}
|
||||
20
src/Infrastructure/BotSharp.Core.SideCar/Using.cs
Normal file
20
src/Infrastructure/BotSharp.Core.SideCar/Using.cs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.Text;
|
||||
global using System.Threading.Tasks;
|
||||
global using System.Linq;
|
||||
global using System.Text.Json;
|
||||
global using System.Net.Mime;
|
||||
global using System.Net.Http;
|
||||
global using System.Threading;
|
||||
global using Microsoft.Extensions.DependencyInjection;
|
||||
global using Microsoft.Extensions.Logging;
|
||||
global using BotSharp.Abstraction.Agents.Enums;
|
||||
global using BotSharp.Abstraction.Conversations;
|
||||
global using BotSharp.Abstraction.Conversations.Enums;
|
||||
global using BotSharp.Abstraction.Conversations.Models;
|
||||
global using BotSharp.Abstraction.Models;
|
||||
global using BotSharp.Abstraction.Routing;
|
||||
global using BotSharp.Abstraction.SideCar;
|
||||
global using BotSharp.Abstraction.Utilities;
|
||||
global using BotSharp.Core.SideCar.Settings;
|
||||
|
|
@ -43,7 +43,6 @@ public class ConversationPlugin : IBotSharpPlugin
|
|||
services.AddScoped<IConversationService, ConversationService>();
|
||||
services.AddScoped<IConversationProgressService, ConversationProgressService>();
|
||||
services.AddScoped<IConversationStateService, ConversationStateService>();
|
||||
services.AddScoped<IConversationSideCar, ConversationSideCar>();
|
||||
services.AddScoped<ITranslationService, TranslationService>();
|
||||
|
||||
// Rich content messaging
|
||||
|
|
|
|||
|
|
@ -10,15 +10,7 @@ public partial class ConversationService : IConversationService
|
|||
var routingCtx = _services.GetRequiredService<IRoutingContext>();
|
||||
var messageId = routingCtx.MessageId;
|
||||
|
||||
//db.UpdateConversationBreakpoint(_conversationId, new ConversationBreakpoint
|
||||
//{
|
||||
// MessageId = messageId,
|
||||
// Breakpoint = DateTime.UtcNow,
|
||||
// Reason = reason
|
||||
//});
|
||||
|
||||
var sidecar = _services.GetRequiredService<IConversationSideCar>();
|
||||
sidecar.UpdateConversationBreakpoint(_conversationId, new ConversationBreakpoint
|
||||
db.UpdateConversationBreakpoint(_conversationId, new ConversationBreakpoint
|
||||
{
|
||||
MessageId = messageId,
|
||||
Breakpoint = DateTime.UtcNow,
|
||||
|
|
|
|||
|
|
@ -140,11 +140,8 @@ public partial class ConversationService : IConversationService
|
|||
|
||||
if (fromBreakpoint)
|
||||
{
|
||||
//var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
//var breakpoint = db.GetConversationBreakpoint(_conversationId);
|
||||
|
||||
var sidecar = _services.GetRequiredService<IConversationSideCar>();
|
||||
var breakpoint = sidecar.GetConversationBreakpoint(_conversationId);
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
var breakpoint = db.GetConversationBreakpoint(_conversationId);
|
||||
|
||||
if (breakpoint != null)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -91,21 +91,13 @@ public class ConversationStorage : IConversationStorage
|
|||
});
|
||||
}
|
||||
|
||||
//db.AppendConversationDialogs(conversationId, dialogElements);
|
||||
|
||||
var sidecar = _services.GetRequiredService<IConversationSideCar>();
|
||||
sidecar.AppendConversationDialogs(conversationId, dialogElements);
|
||||
|
||||
db.AppendConversationDialogs(conversationId, dialogElements);
|
||||
}
|
||||
|
||||
public List<RoleDialogModel> GetDialogs(string conversationId)
|
||||
{
|
||||
//var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
//var dialogs = db.GetConversationDialogs(conversationId);
|
||||
|
||||
var sidecar = _services.GetRequiredService<IConversationSideCar>();
|
||||
var dialogs = sidecar.GetConversationDialogs(conversationId);
|
||||
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
var dialogs = db.GetConversationDialogs(conversationId);
|
||||
var hooks = _services.GetServices<IConversationHook>();
|
||||
|
||||
var results = new List<RoleDialogModel>();
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ namespace BotSharp.Core.Repository;
|
|||
|
||||
public class BotSharpDbContext : Database, IBotSharpRepository
|
||||
{
|
||||
public IServiceProvider ServiceProvider => throw new NotImplementedException();
|
||||
|
||||
#region Plugin
|
||||
public PluginConfig GetPluginConfig() => throw new NotImplementedException();
|
||||
public void SavePluginConfig(PluginConfig config) => throw new NotImplementedException();
|
||||
|
|
@ -90,12 +92,14 @@ public class BotSharpDbContext : Database, IBotSharpRepository
|
|||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
[SideCar]
|
||||
public List<DialogElement> GetConversationDialogs(string conversationId)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public ConversationState GetConversationStates(string conversationId)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
[SideCar]
|
||||
public void AppendConversationDialogs(string conversationId, List<DialogElement> dialogs)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
|
|
@ -108,9 +112,11 @@ public class BotSharpDbContext : Database, IBotSharpRepository
|
|||
public bool UpdateConversationMessage(string conversationId, UpdateMessageRequest request)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
[SideCar]
|
||||
public void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
[SideCar]
|
||||
public ConversationBreakpoint? GetConversationBreakpoint(string conversationId)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ namespace BotSharp.Core.Repository
|
|||
return true;
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public List<DialogElement> GetConversationDialogs(string conversationId)
|
||||
{
|
||||
var dialogs = new List<DialogElement>();
|
||||
|
|
@ -78,6 +79,7 @@ namespace BotSharp.Core.Repository
|
|||
return dialogs;
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public void AppendConversationDialogs(string conversationId, List<DialogElement> dialogs)
|
||||
{
|
||||
var convDir = FindConversationDirectory(conversationId);
|
||||
|
|
@ -182,6 +184,7 @@ namespace BotSharp.Core.Repository
|
|||
return true;
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint)
|
||||
{
|
||||
var convDir = FindConversationDirectory(conversationId);
|
||||
|
|
@ -220,6 +223,7 @@ namespace BotSharp.Core.Repository
|
|||
}
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public ConversationBreakpoint? GetConversationBreakpoint(string conversationId)
|
||||
{
|
||||
var convDir = FindConversationDirectory(conversationId);
|
||||
|
|
|
|||
|
|
@ -171,6 +171,8 @@ public partial class FileRepository : IBotSharpRepository
|
|||
}
|
||||
}
|
||||
|
||||
public IServiceProvider ServiceProvider => _services;
|
||||
|
||||
|
||||
#region Private methods
|
||||
private void DeleteBeforeCreateDirectory(string dir)
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ global using BotSharp.Abstraction.Files.Utilities;
|
|||
global using BotSharp.Abstraction.Translation.Attributes;
|
||||
global using BotSharp.Abstraction.Messaging.Enums;
|
||||
global using BotSharp.Abstraction.Knowledges.Models;
|
||||
global using BotSharp.Abstraction.SideCar.Attributes;
|
||||
global using BotSharp.Core.Repository;
|
||||
global using BotSharp.Core.Routing;
|
||||
global using BotSharp.Core.Agents.Services;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
using BotSharp.Abstraction.SideCar;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
|
||||
namespace BotSharp.Plugin.ChatHub.Hooks;
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ public partial class MongoRepository
|
|||
|| contentLogDeleted.DeletedCount > 0 || stateLogDeleted.DeletedCount > 0;
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public List<DialogElement> GetConversationDialogs(string conversationId)
|
||||
{
|
||||
var dialogs = new List<DialogElement>();
|
||||
|
|
@ -83,6 +84,7 @@ public partial class MongoRepository
|
|||
return formattedDialog ?? new List<DialogElement>();
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public void AppendConversationDialogs(string conversationId, List<DialogElement> dialogs)
|
||||
{
|
||||
if (string.IsNullOrEmpty(conversationId)) return;
|
||||
|
|
@ -159,6 +161,7 @@ public partial class MongoRepository
|
|||
return true;
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint)
|
||||
{
|
||||
if (string.IsNullOrEmpty(conversationId)) return;
|
||||
|
|
@ -176,6 +179,7 @@ public partial class MongoRepository
|
|||
_dc.ConversationStates.UpdateOne(filterState, updateState);
|
||||
}
|
||||
|
||||
[SideCar]
|
||||
public ConversationBreakpoint? GetConversationBreakpoint(string conversationId)
|
||||
{
|
||||
if (string.IsNullOrEmpty(conversationId))
|
||||
|
|
|
|||
|
|
@ -22,4 +22,6 @@ public partial class MongoRepository : IBotSharpRepository
|
|||
IsUpsert = true,
|
||||
};
|
||||
}
|
||||
|
||||
public IServiceProvider ServiceProvider => _services;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ global using BotSharp.Abstraction.Agents.Enums;
|
|||
global using BotSharp.Abstraction.Utilities;
|
||||
global using BotSharp.Abstraction.Plugins;
|
||||
global using BotSharp.Abstraction.Translation.Models;
|
||||
global using BotSharp.Abstraction.SideCar.Attributes;
|
||||
global using Microsoft.Extensions.Configuration;
|
||||
global using Microsoft.Extensions.DependencyInjection;
|
||||
global using MongoDB.Bson;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\tests\BotSharp.Plugin.PizzaBot\BotSharp.Plugin.PizzaBot.csproj" />
|
||||
<ProjectReference Include="..\BotSharp.ServiceDefaults\BotSharp.ServiceDefaults.csproj" />
|
||||
<ProjectReference Include="..\Infrastructure\BotSharp.Core.SideCar\BotSharp.Core.SideCar.csproj" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -151,6 +151,12 @@
|
|||
}
|
||||
},
|
||||
|
||||
"SideCar": {
|
||||
"Conversation": {
|
||||
"Provider": "botsharp"
|
||||
}
|
||||
},
|
||||
|
||||
"WebBrowsing": {
|
||||
"Driver": "Playwright"
|
||||
},
|
||||
|
|
@ -321,6 +327,7 @@
|
|||
"PluginLoader": {
|
||||
"Assemblies": [
|
||||
"BotSharp.Core",
|
||||
"BotSharp.Core.SideCar",
|
||||
"BotSharp.Logger",
|
||||
"BotSharp.Plugin.MongoStorage",
|
||||
"BotSharp.Plugin.Dashboard",
|
||||
|
|
|
|||
Loading…
Reference in a new issue