2024-01-13 02:13:38 +00:00
|
|
|
using BotSharp.Abstraction.Agents.Models;
|
|
|
|
|
using BotSharp.Abstraction.Functions.Models;
|
|
|
|
|
using BotSharp.Abstraction.Repositories.Filters;
|
|
|
|
|
using BotSharp.Abstraction.Routing.Models;
|
|
|
|
|
|
|
|
|
|
namespace BotSharp.Plugin.MongoStorage.Repository;
|
|
|
|
|
|
|
|
|
|
public partial class MongoRepository
|
|
|
|
|
{
|
|
|
|
|
public void UpdateAgent(Agent agent, AgentField field)
|
|
|
|
|
{
|
2024-12-13 20:34:17 +00:00
|
|
|
if (agent == null || string.IsNullOrWhiteSpace(agent.Id)) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
switch (field)
|
|
|
|
|
{
|
|
|
|
|
case AgentField.Name:
|
|
|
|
|
UpdateAgentName(agent.Id, agent.Name);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.Description:
|
|
|
|
|
UpdateAgentDescription(agent.Id, agent.Description);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.IsPublic:
|
|
|
|
|
UpdateAgentIsPublic(agent.Id, agent.IsPublic);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.Disabled:
|
|
|
|
|
UpdateAgentDisabled(agent.Id, agent.Disabled);
|
|
|
|
|
break;
|
2024-01-26 04:32:48 +00:00
|
|
|
case AgentField.Type:
|
|
|
|
|
UpdateAgentType(agent.Id, agent.Type);
|
2024-01-13 02:13:38 +00:00
|
|
|
break;
|
2024-01-29 19:22:37 +00:00
|
|
|
case AgentField.InheritAgentId:
|
|
|
|
|
UpdateAgentInheritAgentId(agent.Id, agent.InheritAgentId);
|
|
|
|
|
break;
|
2025-01-30 17:14:52 +00:00
|
|
|
case AgentField.Profile:
|
2024-01-13 02:13:38 +00:00
|
|
|
UpdateAgentProfiles(agent.Id, agent.Profiles);
|
|
|
|
|
break;
|
2025-01-30 17:14:52 +00:00
|
|
|
case AgentField.Label:
|
|
|
|
|
UpdateAgentLabels(agent.Id, agent.Profiles);
|
|
|
|
|
break;
|
2024-01-13 02:13:38 +00:00
|
|
|
case AgentField.RoutingRule:
|
|
|
|
|
UpdateAgentRoutingRules(agent.Id, agent.RoutingRules);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.Instruction:
|
2024-08-13 21:36:12 +00:00
|
|
|
UpdateAgentInstructions(agent.Id, agent.Instruction, agent.ChannelInstructions);
|
2024-01-13 02:13:38 +00:00
|
|
|
break;
|
|
|
|
|
case AgentField.Function:
|
|
|
|
|
UpdateAgentFunctions(agent.Id, agent.Functions);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.Template:
|
|
|
|
|
UpdateAgentTemplates(agent.Id, agent.Templates);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.Response:
|
|
|
|
|
UpdateAgentResponses(agent.Id, agent.Responses);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.Sample:
|
|
|
|
|
UpdateAgentSamples(agent.Id, agent.Samples);
|
|
|
|
|
break;
|
|
|
|
|
case AgentField.LlmConfig:
|
|
|
|
|
UpdateAgentLlmConfig(agent.Id, agent.LlmConfig);
|
|
|
|
|
break;
|
2024-07-02 18:36:45 +00:00
|
|
|
case AgentField.Utility:
|
2024-11-20 23:57:44 +00:00
|
|
|
UpdateAgentUtilities(agent.Id, agent.MergeUtility, agent.Utilities);
|
2024-06-25 03:46:13 +00:00
|
|
|
break;
|
2024-12-24 19:21:18 +00:00
|
|
|
case AgentField.KnowledgeBase:
|
|
|
|
|
UpdateAgentKnowledgeBases(agent.Id, agent.KnowledgeBases);
|
|
|
|
|
break;
|
2025-01-07 19:50:50 +00:00
|
|
|
case AgentField.Rule:
|
|
|
|
|
UpdateAgentRules(agent.Id, agent.Rules);
|
2025-01-06 05:54:48 +00:00
|
|
|
break;
|
2024-12-13 20:34:17 +00:00
|
|
|
case AgentField.MaxMessageCount:
|
|
|
|
|
UpdateAgentMaxMessageCount(agent.Id, agent.MaxMessageCount);
|
|
|
|
|
break;
|
2024-01-13 02:13:38 +00:00
|
|
|
case AgentField.All:
|
|
|
|
|
UpdateAgentAllFields(agent);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region Update Agent Fields
|
|
|
|
|
private void UpdateAgentName(string agentId, string name)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (string.IsNullOrWhiteSpace(name)) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Name, name)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentDescription(string agentId, string description)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (string.IsNullOrWhiteSpace(description)) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Description, description)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentIsPublic(string agentId, bool isPublic)
|
|
|
|
|
{
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.IsPublic, isPublic)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentDisabled(string agentId, bool disabled)
|
|
|
|
|
{
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Disabled, disabled)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-26 04:32:48 +00:00
|
|
|
private void UpdateAgentType(string agentId, string type)
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
2024-01-26 04:32:48 +00:00
|
|
|
.Set(x => x.Type, type)
|
2024-01-13 02:13:38 +00:00
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-29 19:22:37 +00:00
|
|
|
private void UpdateAgentInheritAgentId(string agentId, string? inheritAgentId)
|
|
|
|
|
{
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.InheritAgentId, inheritAgentId)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
private void UpdateAgentProfiles(string agentId, List<string> profiles)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (profiles == null) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Profiles, profiles)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-30 17:14:52 +00:00
|
|
|
public bool UpdateAgentLabels(string agentId, List<string> labels)
|
|
|
|
|
{
|
|
|
|
|
if (labels == null) return false;
|
|
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Labels, labels)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
var result = _dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
return result.ModifiedCount > 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
private void UpdateAgentRoutingRules(string agentId, List<RoutingRule> rules)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (rules == null) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var ruleElements = rules.Select(x => RoutingRuleMongoElement.ToMongoElement(x)).ToList();
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.RoutingRules, ruleElements)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-13 21:36:12 +00:00
|
|
|
private void UpdateAgentInstructions(string agentId, string instruction, List<ChannelInstruction>? channelInstructions)
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2024-08-13 21:36:12 +00:00
|
|
|
var instructionElements = channelInstructions?.Select(x => ChannelInstructionMongoElement.ToMongoElement(x))?
|
2024-12-13 20:34:17 +00:00
|
|
|
.ToList() ?? [];
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Instruction, instruction)
|
2024-08-13 21:36:12 +00:00
|
|
|
.Set(x => x.ChannelInstructions, instructionElements)
|
2024-01-13 02:13:38 +00:00
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentFunctions(string agentId, List<FunctionDef> functions)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (functions == null) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var functionsToUpdate = functions.Select(f => FunctionDefMongoElement.ToMongoElement(f)).ToList();
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Functions, functionsToUpdate)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentTemplates(string agentId, List<AgentTemplate> templates)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (templates == null) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var templatesToUpdate = templates.Select(t => AgentTemplateMongoElement.ToMongoElement(t)).ToList();
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Templates, templatesToUpdate)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentResponses(string agentId, List<AgentResponse> responses)
|
|
|
|
|
{
|
2024-12-13 20:34:17 +00:00
|
|
|
if (responses == null || string.IsNullOrWhiteSpace(agentId)) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var responsesToUpdate = responses.Select(r => AgentResponseMongoElement.ToMongoElement(r)).ToList();
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Responses, responsesToUpdate)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateAgentSamples(string agentId, List<string> samples)
|
|
|
|
|
{
|
2024-03-05 02:24:07 +00:00
|
|
|
if (samples == null) return;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Samples, samples)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-20 23:57:44 +00:00
|
|
|
private void UpdateAgentUtilities(string agentId, bool mergeUtility, List<AgentUtility> utilities)
|
2024-06-25 03:46:13 +00:00
|
|
|
{
|
2024-07-02 18:36:45 +00:00
|
|
|
if (utilities == null) return;
|
2024-06-25 03:46:13 +00:00
|
|
|
|
2024-11-20 23:10:38 +00:00
|
|
|
var elements = utilities?.Select(x => AgentUtilityMongoElement.ToMongoElement(x))?.ToList() ?? [];
|
|
|
|
|
|
2024-06-25 03:46:13 +00:00
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
2024-11-20 23:57:44 +00:00
|
|
|
.Set(x => x.MergeUtility, mergeUtility)
|
2024-11-20 23:10:38 +00:00
|
|
|
.Set(x => x.Utilities, elements)
|
2024-06-25 03:46:13 +00:00
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-24 19:21:18 +00:00
|
|
|
private void UpdateAgentKnowledgeBases(string agentId, List<AgentKnowledgeBase> knowledgeBases)
|
|
|
|
|
{
|
|
|
|
|
if (knowledgeBases == null) return;
|
|
|
|
|
|
|
|
|
|
var elements = knowledgeBases?.Select(x => AgentKnowledgeBaseMongoElement.ToMongoElement(x))?.ToList() ?? [];
|
|
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.KnowledgeBases, elements)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-07 19:50:50 +00:00
|
|
|
private void UpdateAgentRules(string agentId, List<AgentRule> rules)
|
2025-01-06 05:54:48 +00:00
|
|
|
{
|
|
|
|
|
if (rules == null) return;
|
|
|
|
|
|
2025-01-07 19:50:50 +00:00
|
|
|
var elements = rules?.Select(x => AgentRuleMongoElement.ToMongoElement(x))?.ToList() ?? [];
|
2025-01-06 05:54:48 +00:00
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
2025-01-07 19:50:50 +00:00
|
|
|
.Set(x => x.Rules, elements)
|
2025-01-06 05:54:48 +00:00
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
private void UpdateAgentLlmConfig(string agentId, AgentLlmConfig? config)
|
|
|
|
|
{
|
|
|
|
|
var llmConfig = AgentLlmConfigMongoElement.ToMongoElement(config);
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.LlmConfig, llmConfig)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-13 20:34:17 +00:00
|
|
|
private void UpdateAgentMaxMessageCount(string agentId, int? maxMessageCount)
|
|
|
|
|
{
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.MaxMessageCount, maxMessageCount)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
private void UpdateAgentAllFields(Agent agent)
|
|
|
|
|
{
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agent.Id);
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Name, agent.Name)
|
|
|
|
|
.Set(x => x.Description, agent.Description)
|
|
|
|
|
.Set(x => x.Disabled, agent.Disabled)
|
2024-11-20 23:57:44 +00:00
|
|
|
.Set(x => x.MergeUtility, agent.MergeUtility)
|
2024-01-26 04:32:48 +00:00
|
|
|
.Set(x => x.Type, agent.Type)
|
2024-12-13 20:34:17 +00:00
|
|
|
.Set(x => x.MaxMessageCount, agent.MaxMessageCount)
|
2024-01-13 02:13:38 +00:00
|
|
|
.Set(x => x.Profiles, agent.Profiles)
|
2025-01-30 17:14:52 +00:00
|
|
|
.Set(x => x.Labels, agent.Labels)
|
2024-01-13 02:13:38 +00:00
|
|
|
.Set(x => x.RoutingRules, agent.RoutingRules.Select(r => RoutingRuleMongoElement.ToMongoElement(r)).ToList())
|
|
|
|
|
.Set(x => x.Instruction, agent.Instruction)
|
2024-08-13 21:36:12 +00:00
|
|
|
.Set(x => x.ChannelInstructions, agent.ChannelInstructions.Select(i => ChannelInstructionMongoElement.ToMongoElement(i)).ToList())
|
2024-01-13 02:13:38 +00:00
|
|
|
.Set(x => x.Templates, agent.Templates.Select(t => AgentTemplateMongoElement.ToMongoElement(t)).ToList())
|
|
|
|
|
.Set(x => x.Functions, agent.Functions.Select(f => FunctionDefMongoElement.ToMongoElement(f)).ToList())
|
|
|
|
|
.Set(x => x.Responses, agent.Responses.Select(r => AgentResponseMongoElement.ToMongoElement(r)).ToList())
|
|
|
|
|
.Set(x => x.Samples, agent.Samples)
|
2024-11-20 23:10:38 +00:00
|
|
|
.Set(x => x.Utilities, agent.Utilities.Select(u => AgentUtilityMongoElement.ToMongoElement(u)).ToList())
|
2024-12-24 19:21:18 +00:00
|
|
|
.Set(x => x.KnowledgeBases, agent.KnowledgeBases.Select(u => AgentKnowledgeBaseMongoElement.ToMongoElement(u)).ToList())
|
2025-01-07 19:50:50 +00:00
|
|
|
.Set(x => x.Rules, agent.Rules.Select(e => AgentRuleMongoElement.ToMongoElement(e)).ToList())
|
2024-01-13 02:13:38 +00:00
|
|
|
.Set(x => x.LlmConfig, AgentLlmConfigMongoElement.ToMongoElement(agent.LlmConfig))
|
|
|
|
|
.Set(x => x.IsPublic, agent.IsPublic)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
var res = _dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
2024-12-13 20:34:17 +00:00
|
|
|
public Agent? GetAgent(string agentId, bool basicsOnly = false)
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
|
|
|
|
var agent = _dc.Agents.AsQueryable().FirstOrDefault(x => x.Id == agentId);
|
|
|
|
|
if (agent == null) return null;
|
|
|
|
|
|
2024-02-04 05:42:13 +00:00
|
|
|
return TransformAgentDocument(agent);
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<Agent> GetAgents(AgentFilter filter)
|
|
|
|
|
{
|
2024-11-13 23:16:49 +00:00
|
|
|
if (filter == null)
|
|
|
|
|
{
|
|
|
|
|
filter = AgentFilter.Empty();
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
var agents = new List<Agent>();
|
2024-01-16 01:51:56 +00:00
|
|
|
var builder = Builders<AgentDocument>.Filter;
|
|
|
|
|
var filters = new List<FilterDefinition<AgentDocument>>() { builder.Empty };
|
2024-01-13 02:13:38 +00:00
|
|
|
|
2025-01-30 17:14:52 +00:00
|
|
|
if (filter.AgentIds != null)
|
|
|
|
|
{
|
|
|
|
|
filters.Add(builder.In(x => x.Id, filter.AgentIds));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!filter.AgentNames.IsNullOrEmpty())
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2025-01-30 17:14:52 +00:00
|
|
|
filters.Add(builder.In(x => x.Name, filter.AgentNames));
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2024-11-15 16:36:17 +00:00
|
|
|
if (!string.IsNullOrEmpty(filter.SimilarName))
|
|
|
|
|
{
|
|
|
|
|
filters.Add(builder.Regex(x => x.Name, new BsonRegularExpression(filter.SimilarName, "i")));
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
if (filter.Disabled.HasValue)
|
|
|
|
|
{
|
2024-01-16 01:51:56 +00:00
|
|
|
filters.Add(builder.Eq(x => x.Disabled, filter.Disabled.Value));
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2025-01-30 17:14:52 +00:00
|
|
|
if (!filter.Types.IsNullOrEmpty())
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2025-01-30 17:14:52 +00:00
|
|
|
filters.Add(builder.In(x => x.Type, filter.Types));
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2025-01-30 17:14:52 +00:00
|
|
|
if (!filter.Labels.IsNullOrEmpty())
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2025-01-30 17:14:52 +00:00
|
|
|
filters.Add(builder.AnyIn(x => x.Labels, filter.Labels));
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2025-01-30 17:14:52 +00:00
|
|
|
if (filter.IsPublic.HasValue)
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2025-01-30 17:14:52 +00:00
|
|
|
filters.Add(builder.Eq(x => x.IsPublic, filter.IsPublic.Value));
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2024-01-16 01:51:56 +00:00
|
|
|
var agentDocs = _dc.Agents.Find(builder.And(filters)).ToList();
|
2024-02-04 05:42:13 +00:00
|
|
|
return agentDocs.Select(x => TransformAgentDocument(x)).ToList();
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2024-10-31 19:36:26 +00:00
|
|
|
public List<UserAgent> GetUserAgents(string userId)
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2024-10-31 19:36:26 +00:00
|
|
|
var found = (from ua in _dc.UserAgents.AsQueryable()
|
|
|
|
|
join u in _dc.Users.AsQueryable() on ua.UserId equals u.Id
|
|
|
|
|
where ua.UserId == userId || u.ExternalId == userId
|
|
|
|
|
select ua).ToList();
|
2024-01-13 02:13:38 +00:00
|
|
|
|
2024-10-31 19:36:26 +00:00
|
|
|
if (found.IsNullOrEmpty()) return [];
|
|
|
|
|
|
|
|
|
|
var res = found.Select(x => new UserAgent
|
|
|
|
|
{
|
|
|
|
|
Id = x.Id,
|
|
|
|
|
UserId = x.UserId,
|
|
|
|
|
AgentId = x.AgentId,
|
|
|
|
|
Actions = x.Actions,
|
|
|
|
|
CreatedTime = x.CreatedTime,
|
|
|
|
|
UpdatedTime = x.UpdatedTime
|
|
|
|
|
}).ToList();
|
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
var agentIds = found.Select(x => x.AgentId).Distinct().ToList();
|
|
|
|
|
var agents = GetAgents(new AgentFilter { AgentIds = agentIds });
|
2024-10-31 19:36:26 +00:00
|
|
|
foreach (var item in res)
|
2024-01-13 02:13:38 +00:00
|
|
|
{
|
2024-10-31 19:36:26 +00:00
|
|
|
var agent = agents.FirstOrDefault(x => x.Id == item.AgentId);
|
|
|
|
|
if (agent == null) continue;
|
|
|
|
|
|
|
|
|
|
item.Agent = agent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res;
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<string> GetAgentResponses(string agentId, string prefix, string intent)
|
|
|
|
|
{
|
|
|
|
|
var responses = new List<string>();
|
|
|
|
|
var agent = _dc.Agents.AsQueryable().FirstOrDefault(x => x.Id == agentId);
|
|
|
|
|
if (agent == null) return responses;
|
|
|
|
|
|
|
|
|
|
return agent.Responses.Where(x => x.Prefix == prefix && x.Intent == intent).Select(x => x.Content).ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string GetAgentTemplate(string agentId, string templateName)
|
|
|
|
|
{
|
|
|
|
|
var agent = _dc.Agents.AsQueryable().FirstOrDefault(x => x.Id == agentId);
|
|
|
|
|
if (agent == null) return string.Empty;
|
|
|
|
|
|
2025-01-10 22:09:56 +00:00
|
|
|
return agent.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(templateName))?.Content ?? string.Empty;
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
|
|
|
|
|
2024-05-09 22:06:03 +00:00
|
|
|
public bool PatchAgentTemplate(string agentId, AgentTemplate template)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(agentId) || template == null) return false;
|
|
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var agent = _dc.Agents.Find(filter).FirstOrDefault();
|
|
|
|
|
if (agent == null || agent.Templates.IsNullOrEmpty()) return false;
|
|
|
|
|
|
|
|
|
|
var foundTemplate = agent.Templates.FirstOrDefault(x => x.Name.IsEqualTo(template.Name));
|
|
|
|
|
if (foundTemplate == null) return false;
|
|
|
|
|
|
|
|
|
|
foundTemplate.Content = template.Content;
|
|
|
|
|
var update = Builders<AgentDocument>.Update.Set(x => x.Templates, agent.Templates);
|
|
|
|
|
_dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-30 17:14:52 +00:00
|
|
|
public bool AppendAgentLabels(string agentId, List<string> labels)
|
|
|
|
|
{
|
|
|
|
|
if (labels.IsNullOrEmpty()) return false;
|
|
|
|
|
|
|
|
|
|
var filter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
|
|
|
|
var agent = _dc.Agents.Find(filter).FirstOrDefault();
|
|
|
|
|
if (agent == null) return false;
|
|
|
|
|
|
|
|
|
|
var prevLabels = agent.Labels ?? [];
|
|
|
|
|
var curLabels = prevLabels.Concat(labels).Distinct().ToList();
|
|
|
|
|
var update = Builders<AgentDocument>.Update
|
|
|
|
|
.Set(x => x.Labels, curLabels)
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
var result = _dc.Agents.UpdateOne(filter, update);
|
|
|
|
|
return result.ModifiedCount > 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
public void BulkInsertAgents(List<Agent> agents)
|
|
|
|
|
{
|
|
|
|
|
if (agents.IsNullOrEmpty()) return;
|
|
|
|
|
|
|
|
|
|
var agentDocs = agents.Select(x => new AgentDocument
|
|
|
|
|
{
|
|
|
|
|
Id = !string.IsNullOrEmpty(x.Id) ? x.Id : Guid.NewGuid().ToString(),
|
|
|
|
|
Name = x.Name,
|
2024-01-16 03:26:18 +00:00
|
|
|
IconUrl = x.IconUrl,
|
2024-01-13 02:13:38 +00:00
|
|
|
Description = x.Description,
|
|
|
|
|
Instruction = x.Instruction,
|
2024-12-30 03:49:38 +00:00
|
|
|
Samples = x.Samples ?? [],
|
2024-01-13 02:13:38 +00:00
|
|
|
IsPublic = x.IsPublic,
|
2024-01-26 04:32:48 +00:00
|
|
|
Type = x.Type,
|
2024-01-29 19:22:37 +00:00
|
|
|
InheritAgentId = x.InheritAgentId,
|
2024-01-13 02:13:38 +00:00
|
|
|
Disabled = x.Disabled,
|
2024-11-20 23:57:44 +00:00
|
|
|
MergeUtility = x.MergeUtility,
|
2024-12-13 20:34:17 +00:00
|
|
|
MaxMessageCount = x.MaxMessageCount,
|
2024-12-30 03:49:38 +00:00
|
|
|
Profiles = x.Profiles ?? [],
|
2025-02-03 19:03:21 +00:00
|
|
|
Labels = x.Labels ?? [],
|
2024-01-13 02:13:38 +00:00
|
|
|
LlmConfig = AgentLlmConfigMongoElement.ToMongoElement(x.LlmConfig),
|
2024-12-30 03:49:38 +00:00
|
|
|
ChannelInstructions = x.ChannelInstructions?.Select(i => ChannelInstructionMongoElement.ToMongoElement(i))?.ToList() ?? [],
|
|
|
|
|
Templates = x.Templates?.Select(t => AgentTemplateMongoElement.ToMongoElement(t))?.ToList() ?? [],
|
|
|
|
|
Functions = x.Functions?.Select(f => FunctionDefMongoElement.ToMongoElement(f))?.ToList() ?? [],
|
|
|
|
|
Responses = x.Responses?.Select(r => AgentResponseMongoElement.ToMongoElement(r))?.ToList() ?? [],
|
|
|
|
|
RoutingRules = x.RoutingRules?.Select(r => RoutingRuleMongoElement.ToMongoElement(r))?.ToList() ?? [],
|
|
|
|
|
Utilities = x.Utilities?.Select(u => AgentUtilityMongoElement.ToMongoElement(u))?.ToList() ?? [],
|
|
|
|
|
KnowledgeBases = x.KnowledgeBases?.Select(k => AgentKnowledgeBaseMongoElement.ToMongoElement(k))?.ToList() ?? [],
|
2025-01-07 19:50:50 +00:00
|
|
|
Rules = x.Rules?.Select(e => AgentRuleMongoElement.ToMongoElement(e))?.ToList() ?? [],
|
2024-01-13 02:13:38 +00:00
|
|
|
CreatedTime = x.CreatedDateTime,
|
|
|
|
|
UpdatedTime = x.UpdatedDateTime
|
|
|
|
|
}).ToList();
|
|
|
|
|
|
|
|
|
|
_dc.Agents.InsertMany(agentDocs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void BulkInsertUserAgents(List<UserAgent> userAgents)
|
|
|
|
|
{
|
|
|
|
|
if (userAgents.IsNullOrEmpty()) return;
|
|
|
|
|
|
2024-11-04 17:22:02 +00:00
|
|
|
var filtered = userAgents.Where(x => !string.IsNullOrEmpty(x.UserId) && !string.IsNullOrEmpty(x.AgentId)).ToList();
|
|
|
|
|
if (filtered.IsNullOrEmpty()) return;
|
|
|
|
|
|
|
|
|
|
var userAgentDocs = filtered.Select(x => new UserAgentDocument
|
|
|
|
|
{
|
|
|
|
|
Id = !string.IsNullOrEmpty(x.Id) ? x.Id : Guid.NewGuid().ToString(),
|
|
|
|
|
UserId = x.UserId,
|
|
|
|
|
AgentId = x.AgentId,
|
|
|
|
|
Actions = x.Actions,
|
|
|
|
|
CreatedTime = x.CreatedTime,
|
|
|
|
|
UpdatedTime = x.UpdatedTime
|
|
|
|
|
}).ToList();
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
_dc.UserAgents.InsertMany(userAgentDocs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DeleteAgents()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_dc.UserAgents.DeleteMany(Builders<UserAgentDocument>.Filter.Empty);
|
2024-11-14 23:33:26 +00:00
|
|
|
_dc.RoleAgents.DeleteMany(Builders<RoleAgentDocument>.Filter.Empty);
|
2024-01-13 02:13:38 +00:00
|
|
|
_dc.Agents.DeleteMany(Builders<AgentDocument>.Filter.Empty);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-04-11 07:00:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DeleteAgent(string agentId)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(agentId)) return false;
|
|
|
|
|
|
|
|
|
|
var agentFilter = Builders<AgentDocument>.Filter.Eq(x => x.Id, agentId);
|
2024-10-31 19:36:26 +00:00
|
|
|
var userAgentFilter = Builders<UserAgentDocument>.Filter.Eq(x => x.AgentId, agentId);
|
2024-11-14 23:33:26 +00:00
|
|
|
var roleAgentFilter = Builders<RoleAgentDocument>.Filter.Eq(x => x.AgentId, agentId);
|
2024-04-11 07:00:17 +00:00
|
|
|
var agentTaskFilter = Builders<AgentTaskDocument>.Filter.Eq(x => x.AgentId, agentId);
|
2024-01-13 02:13:38 +00:00
|
|
|
|
2024-04-11 07:00:17 +00:00
|
|
|
_dc.Agents.DeleteOne(agentFilter);
|
2024-10-31 19:36:26 +00:00
|
|
|
_dc.UserAgents.DeleteMany(userAgentFilter);
|
2024-11-14 23:33:26 +00:00
|
|
|
_dc.RoleAgents.DeleteMany(roleAgentFilter);
|
2024-04-11 07:00:17 +00:00
|
|
|
_dc.AgentTasks.DeleteMany(agentTaskFilter);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|
2024-02-04 05:42:13 +00:00
|
|
|
|
|
|
|
|
private Agent TransformAgentDocument(AgentDocument? agentDoc)
|
|
|
|
|
{
|
|
|
|
|
if (agentDoc == null) return new Agent();
|
|
|
|
|
|
|
|
|
|
return new Agent
|
|
|
|
|
{
|
|
|
|
|
Id = agentDoc.Id,
|
|
|
|
|
Name = agentDoc.Name,
|
|
|
|
|
IconUrl = agentDoc.IconUrl,
|
|
|
|
|
Description = agentDoc.Description,
|
|
|
|
|
Instruction = agentDoc.Instruction,
|
2024-11-20 23:10:38 +00:00
|
|
|
Samples = agentDoc.Samples ?? [],
|
2024-02-04 05:42:13 +00:00
|
|
|
IsPublic = agentDoc.IsPublic,
|
|
|
|
|
Disabled = agentDoc.Disabled,
|
2024-11-20 23:57:44 +00:00
|
|
|
MergeUtility = agentDoc.MergeUtility,
|
2024-02-04 05:42:13 +00:00
|
|
|
Type = agentDoc.Type,
|
|
|
|
|
InheritAgentId = agentDoc.InheritAgentId,
|
2025-01-30 17:14:52 +00:00
|
|
|
Profiles = agentDoc.Profiles ?? [],
|
|
|
|
|
Labels = agentDoc.Labels ?? [],
|
2024-12-30 03:49:38 +00:00
|
|
|
MaxMessageCount = agentDoc.MaxMessageCount,
|
|
|
|
|
LlmConfig = AgentLlmConfigMongoElement.ToDomainElement(agentDoc.LlmConfig),
|
|
|
|
|
ChannelInstructions = agentDoc.ChannelInstructions?.Select(i => ChannelInstructionMongoElement.ToDomainElement(i))?.ToList() ?? [],
|
|
|
|
|
Templates = agentDoc.Templates?.Select(t => AgentTemplateMongoElement.ToDomainElement(t))?.ToList() ?? [],
|
|
|
|
|
Functions = agentDoc.Functions?.Select(f => FunctionDefMongoElement.ToDomainElement(f)).ToList() ?? [],
|
|
|
|
|
Responses = agentDoc.Responses?.Select(r => AgentResponseMongoElement.ToDomainElement(r))?.ToList() ?? [],
|
|
|
|
|
RoutingRules = agentDoc.RoutingRules?.Select(r => RoutingRuleMongoElement.ToDomainElement(agentDoc.Id, agentDoc.Name, r))?.ToList() ?? [],
|
|
|
|
|
Utilities = agentDoc.Utilities?.Select(u => AgentUtilityMongoElement.ToDomainElement(u))?.ToList() ?? [],
|
2025-01-06 05:54:48 +00:00
|
|
|
KnowledgeBases = agentDoc.KnowledgeBases?.Select(x => AgentKnowledgeBaseMongoElement.ToDomainElement(x))?.ToList() ?? [],
|
2025-01-07 19:50:50 +00:00
|
|
|
Rules = agentDoc.Rules?.Select(e => AgentRuleMongoElement.ToDomainElement(e))?.ToList() ?? []
|
2024-02-04 05:42:13 +00:00
|
|
|
};
|
|
|
|
|
}
|
2024-01-13 02:13:38 +00:00
|
|
|
}
|