Skip to content

Commit de3621f

Browse files
author
Jicheng Lu
committed
dynamic register fluid model
1 parent 65d5e2c commit de3621f

File tree

8 files changed

+85
-9
lines changed

8 files changed

+85
-9
lines changed

src/Infrastructure/BotSharp.Abstraction/Templating/ITemplateRender.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ namespace BotSharp.Abstraction.Templating;
33
public interface ITemplateRender
44
{
55
string Render(string template, Dictionary<string, object> dict);
6+
void Register(Type type);
67
}

src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using BotSharp.Abstraction.MLTasks;
22
using BotSharp.Abstraction.Plugins.Models;
33
using BotSharp.Abstraction.Settings;
4+
using BotSharp.Abstraction.Templating;
45
using BotSharp.Abstraction.Users.Enums;
56
using Microsoft.Extensions.Configuration;
67

@@ -33,6 +34,8 @@ public void RegisterDI(IServiceCollection services, IConfiguration config)
3334
services.AddScoped(provider =>
3435
{
3536
var settingService = provider.GetRequiredService<ISettingService>();
37+
var render = provider.GetRequiredService<ITemplateRender>();
38+
render.Register(typeof(AgentSettings));
3639
return settingService.Bind<AgentSettings>("Agent");
3740
});
3841
}

src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ public partial class AgentService
99
public string RenderedInstruction(Agent agent)
1010
{
1111
var render = _services.GetRequiredService<ITemplateRender>();
12-
// update states
1312
var conv = _services.GetRequiredService<IConversationService>();
13+
14+
// update states
1415
foreach (var t in conv.States.GetStates())
1516
{
1617
agent.TemplateDict[t.Key] = t.Value;
1718
}
18-
return render.Render(agent.Instruction, agent.TemplateDict);
19+
20+
var res = render.Render(agent.Instruction, agent.TemplateDict);
21+
return res;
1922
}
2023

2124
public bool RenderFunction(Agent agent, FunctionDef def)
@@ -108,16 +111,18 @@ public bool RenderFunction(Agent agent, FunctionDef def)
108111

109112
public string RenderedTemplate(Agent agent, string templateName)
110113
{
111-
// render liquid template
114+
var conv = _services.GetRequiredService<IConversationService>();
112115
var render = _services.GetRequiredService<ITemplateRender>();
116+
113117
var template = agent.Templates.First(x => x.Name == templateName).Content;
118+
114119
// update states
115-
var conv = _services.GetRequiredService<IConversationService>();
116120
foreach (var t in conv.States.GetStates())
117121
{
118122
agent.TemplateDict[t.Key] = t.Value;
119123
}
120124

125+
// render liquid template
121126
var content = render.Render(template, agent.TemplateDict);
122127

123128
HookEmitter.Emit<IContentGeneratingHook>(_services, async hook =>
@@ -126,4 +131,4 @@ await hook.OnRenderingTemplate(agent, templateName, content)
126131

127132
return content;
128133
}
129-
}
134+
}

src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
using StackExchange.Redis;
1313
using BotSharp.Core.Infrastructures.Events;
1414
using BotSharp.Core.Roles.Services;
15+
using BotSharp.Abstraction.Templating;
16+
using BotSharp.Core.Templating;
1517

1618
namespace BotSharp.Core;
1719

@@ -24,6 +26,8 @@ public static IServiceCollection AddBotSharpCore(this IServiceCollection service
2426
services.AddSingleton(x => interpreterSettings);
2527

2628
services.AddSingleton<DistributedLocker>();
29+
// Register template render
30+
services.AddSingleton<ITemplateRender, TemplateRender>();
2731

2832
services.AddScoped<ISettingService, SettingService>();
2933
services.AddScoped<IRoleService, RoleService>();

src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public void RegisterDI(IServiceCollection services, IConfiguration config)
3030
services.AddScoped(provider =>
3131
{
3232
var settingService = provider.GetRequiredService<ISettingService>();
33+
var render = provider.GetRequiredService<ITemplateRender>();
34+
render.Register(typeof(ConversationSetting));
3335
return settingService.Bind<ConversationSetting>("Conversation");
3436
});
3537

@@ -48,8 +50,6 @@ public void RegisterDI(IServiceCollection services, IConfiguration config)
4850
// Rich content messaging
4951
services.AddScoped<IRichContentService, RichContentService>();
5052

51-
// Register template render
52-
services.AddSingleton<ITemplateRender, TemplateRender>();
5353
services.AddScoped<IResponseTemplateService, ResponseTemplateService>();
5454

5555
services.AddScoped<IExecutor, InstructExecutor>();

src/Infrastructure/BotSharp.Core/Templating/TemplateRender.cs

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using BotSharp.Abstraction.Agents.Models;
2-
using BotSharp.Abstraction.Functions.Models;
31
using BotSharp.Abstraction.Models;
42
using BotSharp.Abstraction.Routing.Models;
53
using BotSharp.Abstraction.Templating;
64
using BotSharp.Abstraction.Translation.Models;
75
using Fluid;
6+
using System.Collections;
7+
using System.Reflection;
88

99
namespace BotSharp.Core.Templating;
1010

@@ -48,4 +48,47 @@ public string Render(string template, Dictionary<string, object> dict)
4848
return template;
4949
}
5050
}
51+
52+
53+
public void Register(Type type)
54+
{
55+
if (type == null || IsStringType(type)) return;
56+
57+
if (IsListType(type))
58+
{
59+
if (type.IsGenericType)
60+
{
61+
var genericType = type.GetGenericArguments()[0];
62+
Register(genericType);
63+
}
64+
}
65+
else if (IsTrackToNextLevel(type))
66+
{
67+
_options.MemberAccessStrategy.Register(type);
68+
var props = type.GetProperties();
69+
foreach (var prop in props)
70+
{
71+
Register(prop.PropertyType);
72+
}
73+
}
74+
}
75+
76+
77+
#region Private methods
78+
private static bool IsStringType(Type type)
79+
{
80+
return type == typeof(string);
81+
}
82+
83+
private static bool IsListType(Type type)
84+
{
85+
var interfaces = type.GetTypeInfo().ImplementedInterfaces;
86+
return type.IsArray || interfaces.Any(x => x.Name == typeof(IEnumerable).Name);
87+
}
88+
89+
private static bool IsTrackToNextLevel(Type type)
90+
{
91+
return type.IsClass || type.IsInterface || type.IsAbstract;
92+
}
93+
#endregion
5194
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using BotSharp.Abstraction.Agents.Settings;
2+
3+
namespace BotSharp.Plugin.SqlDriver.Hooks;
4+
5+
public class SqlDriverAgentHook : AgentHookBase, IAgentHook
6+
{
7+
public override string SelfId => BuiltInAgentId.Planner;
8+
9+
public SqlDriverAgentHook(IServiceProvider services, AgentSettings settings)
10+
: base(services, settings)
11+
{
12+
}
13+
14+
public override void OnAgentLoaded(Agent agent)
15+
{
16+
var dbType = SqlDriverHelper.GetDatabaseType(_services);
17+
agent.TemplateDict["db_type"] = dbType;
18+
}
19+
}

src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public void RegisterDI(IServiceCollection services, IConfiguration config)
2727
services.AddScoped<DbKnowledgeService>();
2828
services.AddScoped<IPlanningHook, SqlDriverPlanningHook>();
2929
services.AddScoped<IKnowledgeHook, SqlDriverKnowledgeHook>();
30+
services.AddScoped<IAgentHook, SqlDriverAgentHook>();
3031
services.AddScoped<IConversationHook, SqlDriverConversationHook>();
3132
services.AddScoped<IAgentUtilityHook, SqlUtilityHook>();
3233
}

0 commit comments

Comments
 (0)