BotSharp/BotSharp.Core/PlatformBuilderBase.cs
2018-10-04 16:18:46 -05:00

125 lines
3.4 KiB
C#

using BotSharp.Core.Engines;
using BotSharp.Platform.Abstraction;
using BotSharp.Platform.Models;
using BotSharp.Platform.Models.MachineLearning;
using DotNetToolkit;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BotSharp.Core
{
public abstract class PlatformBuilderBase<TAgent> where TAgent : AgentBase
{
public IAgentStorage<TAgent> Storage { get; set; }
public IConfiguration PlatformConfig { get; set; }
public List<TAgent> GetAllAgents()
{
GetStorage();
return Storage.Query();
}
public TAgent LoadAgentFromFile<TImporter>(string dataDir) where TImporter : IAgentImporter<TAgent>, new()
{
var meta = LoadMeta(dataDir);
var importer = new TImporter();
importer.AgentDir = dataDir;
// Load agent summary
var agent = importer.LoadAgent(meta);
// Load user custom entities
importer.LoadCustomEntities(agent);
// Load agent intents
importer.LoadIntents(agent);
// Load system buildin entities
importer.LoadBuildinEntities(agent);
return agent;
}
private AgentImportHeader LoadMeta(string dataDir)
{
// load meta
string metaJson = File.ReadAllText(Path.Combine(dataDir, "meta.json"));
return JsonConvert.DeserializeObject<AgentImportHeader>(metaJson);
}
public TAgent GetAgentById(string agentId)
{
GetStorage();
return Storage.FetchById(agentId);
}
public TAgent GetAgentByName(string agentName)
{
GetStorage();
return Storage.FetchByName(agentName);
}
public virtual async Task<ModelMetaData> Train(TAgent agent, TrainingCorpus corpus, BotTrainOptions options)
{
if (String.IsNullOrEmpty(options.AgentDir))
{
options.AgentDir = Path.Combine(AppDomain.CurrentDomain.GetData("DataPath").ToString(), "Projects", agent.Id);
}
if (String.IsNullOrEmpty(options.Model))
{
options.Model = "model_" + DateTime.UtcNow.ToString("yyyyMMdd");
}
var trainer = new BotTrainer();
agent.Corpus = corpus;
var info = await trainer.Train(agent, options);
return info;
}
public virtual bool SaveAgent(TAgent agent)
{
GetStorage();
// default save agent in FileStorage
Storage.Persist(agent);
return true;
}
private IAgentStorage<TAgent> GetStorage()
{
if (Storage == null)
{
string storageName = PlatformConfig.GetValue<String>("AgentStorage");
switch (storageName)
{
case "AgentStorageInRedis":
Storage = Activator.CreateInstance<AgentStorageInRedis<TAgent>>();
break;
case "AgentStorageInMemory":
Storage = Activator.CreateInstance<AgentStorageInMemory<TAgent>>();
break;
}
}
return Storage;
}
}
}