Skip to content

Commit ed7cabd

Browse files
authored
Merge pull request #403 from iceljc/features/add-visible-property
add visible property
2 parents 32daf80 + 84220a8 commit ed7cabd

File tree

8 files changed

+72
-13
lines changed

8 files changed

+72
-13
lines changed

src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public interface IAgentService
2626

2727
bool RenderFunction(Agent agent, FunctionDef def);
2828

29+
FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def);
30+
2931
/// <summary>
3032
/// Get agent detail without trigger any hook.
3133
/// </summary>

src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace BotSharp.Abstraction.Conversations;
99
public interface IConversationStateService
1010
{
1111
string GetConversationId();
12-
Dictionary<string, string> Load(string conversationId);
12+
Dictionary<string, string> Load(string conversationId, bool isReadOnly = false);
1313
string GetState(string name, string defaultValue = "");
1414
bool ContainsState(string name);
1515
Dictionary<string, string> GetStates();

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using BotSharp.Abstraction.Loggers;
22
using BotSharp.Abstraction.Templating;
3+
using Newtonsoft.Json.Linq;
34

45
namespace BotSharp.Core.Agents.Services;
56

@@ -32,6 +33,64 @@ public bool RenderFunction(Agent agent, FunctionDef def)
3233
return true;
3334
}
3435

36+
public FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def)
37+
{
38+
var parameterDef = def?.Parameters;
39+
var propertyDef = parameterDef?.Properties;
40+
if (propertyDef == null) return null;
41+
42+
var visibleExpress = "visibility_expression";
43+
var root = propertyDef.RootElement;
44+
var iterator = root.EnumerateObject();
45+
var visibleProps = new List<string>();
46+
while (iterator.MoveNext())
47+
{
48+
var prop = iterator.Current;
49+
var name = prop.Name;
50+
var node = prop.Value;
51+
var matched = true;
52+
if (node.TryGetProperty(visibleExpress, out var element))
53+
{
54+
var expression = element.GetString();
55+
var render = _services.GetRequiredService<ITemplateRender>();
56+
var result = render.Render(expression, new Dictionary<string, object>
57+
{
58+
{ "states", agent.TemplateDict }
59+
});
60+
matched = result == "visible";
61+
}
62+
63+
if (matched)
64+
{
65+
visibleProps.Add(name);
66+
}
67+
}
68+
69+
var rootObject = JObject.Parse(root.GetRawText());
70+
var clonedRoot = rootObject.DeepClone() as JObject;
71+
var required = parameterDef?.Required ?? new List<string>();
72+
foreach (var property in rootObject.Properties())
73+
{
74+
if (visibleProps.Contains(property.Name))
75+
{
76+
var value = clonedRoot.GetValue(property.Name) as JObject;
77+
if (value != null && value.ContainsKey(visibleExpress))
78+
{
79+
value.Remove(visibleExpress);
80+
}
81+
}
82+
else
83+
{
84+
clonedRoot.Remove(property.Name);
85+
required.Remove(property.Name);
86+
}
87+
}
88+
89+
parameterDef.Properties = JsonSerializer.Deserialize<JsonDocument>(clonedRoot.ToString());
90+
parameterDef.Required = required;
91+
return parameterDef; ;
92+
}
93+
3594
public string RenderedTemplate(Agent agent, string templateName)
3695
{
3796
// render liquid template

src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,15 @@ public IConversationStateService SetState<T>(string name, T value, bool isNeedVe
117117
return this;
118118
}
119119

120-
public Dictionary<string, string> Load(string conversationId)
120+
public Dictionary<string, string> Load(string conversationId, bool isReadOnly = false)
121121
{
122-
_conversationId = conversationId;
122+
_conversationId = !isReadOnly ? conversationId : null;
123123

124124
var routingCtx = _services.GetRequiredService<IRoutingContext>();
125125
var curMsgId = routingCtx.MessageId;
126126

127-
_historyStates = _db.GetConversationStates(_conversationId);
128-
var dialogs = _db.GetConversationDialogs(_conversationId);
127+
_historyStates = _db.GetConversationStates(conversationId);
128+
var dialogs = _db.GetConversationDialogs(conversationId);
129129
var userDialogs = dialogs.Where(x => x.MetaData?.Role == AgentRole.User || x.MetaData?.Role == UserRole.Client)
130130
.OrderBy(x => x.MetaData?.CreateTime)
131131
.ToList();
@@ -177,7 +177,7 @@ public Dictionary<string, string> Load(string conversationId)
177177
_logger.LogInformation($"[STATE] {key} : {data}");
178178
}
179179

180-
_logger.LogInformation($"Loaded conversation states: {_conversationId}");
180+
_logger.LogInformation($"Loaded conversation states: {conversationId}");
181181
var hooks = _services.GetServices<IConversationHook>();
182182
foreach (var hook in hooks)
183183
{

src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public async Task<ConversationViewModel> GetConversation([FromRoute] string conv
125125
var result = ConversationViewModel.FromSession(conversations.Items.First());
126126

127127
var state = _services.GetRequiredService<IConversationStateService>();
128-
result.States = state.Load(conversationId);
128+
result.States = state.Load(conversationId, isReadOnly: true);
129129

130130
var user = await userService.GetUser(result.User.Id);
131131
result.User = UserViewModel.FromUser(user);

src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,12 @@ public async Task<bool> GetChatCompletionsStreamingAsync(Agent agent, List<RoleD
221221
{
222222
if (agentService.RenderFunction(agent, function))
223223
{
224+
var property = agentService.RenderFunctionProperty(agent, function);
224225
chatCompletionsOptions.Functions.Add(new FunctionDefinition
225226
{
226227
Name = function.Name,
227228
Description = function.Description,
228-
Parameters = BinaryData.FromObjectAsJson(function.Parameters)
229+
Parameters = BinaryData.FromObjectAsJson(property)
229230
});
230231
}
231232
}

src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,11 @@ public void UpdateConversationStates(string conversationId, List<StateKeyValue>
191191
{
192192
if (string.IsNullOrEmpty(conversationId) || states == null) return;
193193

194-
var filterConv = Builders<ConversationDocument>.Filter.Eq(x => x.Id, conversationId);
195194
var filterStates = Builders<ConversationStateDocument>.Filter.Eq(x => x.ConversationId, conversationId);
196195
var saveStates = states.Select(x => StateMongoElement.ToMongoElement(x)).ToList();
197196
var updateStates = Builders<ConversationStateDocument>.Update.Set(x => x.States, saveStates);
198-
var updateConv = Builders<ConversationDocument>.Update.Set(x => x.UpdatedTime, DateTime.UtcNow);
199197

200198
_dc.ConversationStates.UpdateOne(filterStates, updateStates);
201-
_dc.Conversations.UpdateOne(filterConv, updateConv);
202199
}
203200

204201
public void UpdateConversationStatus(string conversationId, string status)
@@ -391,7 +388,7 @@ public List<string> GetIdleConversations(int batchSize, int messageLimit, int bu
391388
{
392389
var skip = (page - 1) * batchSize;
393390
var candidates = _dc.Conversations.AsQueryable()
394-
.Where(x => (x.DialogCount <= messageLimit) && x.UpdatedTime <= utcNow.AddHours(-bufferHours))
391+
.Where(x => x.DialogCount <= messageLimit && x.UpdatedTime <= utcNow.AddHours(-bufferHours))
395392
.Skip(skip)
396393
.Take(batchSize)
397394
.Select(x => x.Id)

src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public void SetModelName(string model)
222222
return (prompt, messages.ToArray(), functions.ToArray());
223223
}
224224

225-
private string GetPrompt(List<ChatMessage> messages,List<FunctionDef> functions)
225+
private string GetPrompt(List<ChatMessage> messages, List<FunctionDef> functions)
226226
{
227227
var prompt = string.Empty;
228228

0 commit comments

Comments
 (0)