BotSharp/BotSharp.Core/Agents/AgentDriver.cs

152 lines
5.6 KiB
C#
Raw Normal View History

2018-04-02 22:42:11 +00:00
using BotSharp.Core.Adapters.Rasa;
2018-05-22 00:39:33 +00:00
using BotSharp.Core.Engines;
2018-04-02 22:42:11 +00:00
using BotSharp.Core.Entities;
2018-03-28 22:08:49 +00:00
using BotSharp.Core.Intents;
using BotSharp.Core.Models;
2017-12-30 20:26:35 +00:00
using EntityFrameworkCore.BootKit;
2017-12-18 13:31:15 +00:00
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
2018-03-28 22:08:49 +00:00
namespace BotSharp.Core.Agents
2017-12-18 13:31:15 +00:00
{
2018-05-22 00:39:33 +00:00
public static class AgentDriver
2017-12-18 13:31:15 +00:00
{
2018-06-13 12:23:03 +00:00
public static Agent LoadAgentById(this IBotPlatform engine, Database dc, string agentId)
2018-05-23 05:11:15 +00:00
{
var clientAccessToken = dc.Table<Agent>().Find(agentId).ClientAccessToken;
var config = new AIConfiguration(clientAccessToken, SupportedLanguage.English);
var rasa = new RasaAi(dc, config);
rasa.agent = rasa.LoadAgent(dc, config);
return rasa.agent;
}
2018-06-13 12:23:03 +00:00
public static Agent LoadAgent(this IBotPlatform engine, Database dc, AIConfiguration aiConfig)
2018-05-22 00:39:33 +00:00
{
return dc.Table<Agent>()
.Include(x => x.Intents).ThenInclude(x => x.Contexts)
.Include(x => x.Entities).ThenInclude(x => x.Entries).ThenInclude(x => x.Synonyms)
2018-07-12 15:07:05 +00:00
.Include(x => x.MlConfig)
2018-05-22 00:39:33 +00:00
.FirstOrDefault(x => x.ClientAccessToken == aiConfig.ClientAccessToken || x.DeveloperAccessToken == aiConfig.ClientAccessToken);
}
2018-01-02 18:05:35 +00:00
/// <summary>
2018-05-22 00:39:33 +00:00
/// Restore a agent instance from backup json files
2018-01-02 18:05:35 +00:00
/// </summary>
2018-05-22 00:39:33 +00:00
/// <param name="importor"></param>
2018-01-02 18:05:35 +00:00
/// <param name="agentId"></param>
/// <returns></returns>
2018-06-13 12:23:03 +00:00
public static Agent RestoreAgent(this IBotPlatform engine, IAgentImporter importer, String agentId, string dataDir)
2018-01-02 18:05:35 +00:00
{
2018-05-22 00:39:33 +00:00
// Load agent summary
var agent = importer.LoadAgent(agentId, dataDir);
// Load user custom entities
importer.LoadCustomEntities(agent, dataDir);
2018-05-22 00:39:33 +00:00
// Load agent intents
importer.LoadIntents(agent, dataDir);
// Load system buildin entities
importer.LoadBuildinEntities(agent, dataDir);
2018-05-22 00:39:33 +00:00
return agent;
2018-01-02 18:05:35 +00:00
}
2018-05-22 00:39:33 +00:00
public static String SaveAgent(this Agent agent, Database dc)
2017-12-30 20:26:35 +00:00
{
2018-05-22 00:39:33 +00:00
var existedAgent = dc.Table<Agent>().FirstOrDefault(x => x.Id == agent.Id || x.Name == agent.Name);
if (existedAgent == null)
{
dc.Table<Agent>().Add(agent);
return agent.Id;
}
else
{
agent.Id = existedAgent.Id;
return existedAgent.Id;
}
2017-12-30 20:26:35 +00:00
}
2018-04-06 22:39:30 +00:00
public static RasaTrainingData GrabCorpus(this Agent agent, Database dc)
{
var trainingData = new RasaTrainingData
{
Entities = new List<RasaTraningEntity>(),
UserSays = new List<RasaIntentExpression>()
};
var expressParts = new List<IntentExpressionPart>();
var intents = dc.Table<Intent>()
.Include(x => x.Contexts)
.Include(x => x.UserSays).ThenInclude(say => say.Data)
2018-06-06 16:20:02 +00:00
.Where(x => x.AgentId == agent.Id && x.UserSays.Count > 0)
2018-04-06 22:39:30 +00:00
.ToList();
intents.ForEach(intent =>
{
intent.UserSays.ForEach(exp =>
{
var say = new RasaIntentExpression
{
Intent = intent.Name,
Text = String.Join("", exp.Data.OrderBy(x => x.UpdatedTime).Select(x => x.Text)),
2018-06-18 22:15:32 +00:00
ContextHash = intent.ContextHash
2018-04-06 22:39:30 +00:00
};
// convert entity format
exp.Data.Where(x => !String.IsNullOrEmpty(x.Meta))
.ToList()
.ForEach(x =>
{
int start = say.Text.IndexOf(x.Text);
var part = new RasaIntentExpressionPart
{
Value = x.Text,
Entity = $"{x.Meta}:{x.Alias}",
2018-04-06 22:39:30 +00:00
Start = start,
End = start + x.Text.Length
};
if (say.Entities == null) say.Entities = new List<RasaIntentExpressionPart>();
say.Entities.Add(part);
// assemble entity synonmus
if (!trainingData.Entities.Any(y => y.EntityType == x.Alias && y.EntityValue == x.Text))
{
2018-05-22 00:39:33 +00:00
var allSynonyms = (from e in dc.Table<EntityType>()
2018-04-06 22:39:30 +00:00
join ee in dc.Table<EntityEntry>() on e.Id equals ee.EntityId
2018-05-22 00:39:33 +00:00
join ees in dc.Table<EntrySynonym>() on ee.Id equals ees.EntityEntryId
2018-04-06 22:39:30 +00:00
where e.Name == x.Alias && ee.Value == x.Text & ees.Synonym != x.Text
select ees.Synonym).ToList();
var te = new RasaTraningEntity
{
EntityType = $"{x.Meta}:{x.Alias}",
2018-04-06 22:39:30 +00:00
EntityValue = x.Text,
Synonyms = allSynonyms
};
trainingData.Entities.Add(te);
}
});
trainingData.UserSays.Add(say);
});
});
2018-06-18 22:15:32 +00:00
// remove Default Fallback Intent
trainingData.UserSays = trainingData.UserSays.Where(x => x.Intent != "Default Fallback Intent").ToList();
2017-12-18 13:31:15 +00:00
return trainingData;
}
}
}