public async Task <AiResponse> TextRequest(AiRequest request) { var aiResponse = new AiResponse(); // Load agent var projectPath = Path.Combine(AppDomain.CurrentDomain.GetData("DataPath").ToString(), "Projects", request.AgentId); var model = Directory.GetDirectories(projectPath).Where(x => x.Contains("model_")).Last().Split(Path.DirectorySeparatorChar).Last(); var modelPath = Path.Combine(projectPath, model); request.AgentDir = projectPath; request.Model = model; var agent = await GetAgentById(request.AgentId); var preditor = new BotPredictor(); var doc = await preditor.Predict(agent, request); var parameters = new Dictionary <String, Object>(); if (doc.Sentences[0].Entities == null) { doc.Sentences[0].Entities = new List <NlpEntity>(); } doc.Sentences[0].Entities.ForEach(x => parameters[x.Entity] = x.Value); aiResponse.Intent = doc.Sentences[0].Intent.Label; aiResponse.Speech = aiResponse.Intent; return(aiResponse); }
public async Task <AiResponse> TextRequest(AiRequest request) { AiResponse aiResponse = new AiResponse(); /*string model = RasaRequestExtension.GetModelPerContexts(agent, AiConfig, request, dc); * var result = CallRasa(agent.Id, request.Query.First(), model); * * result.Content.Log(); * * RasaResponse response = result.Data; * aiResponse.Id = Guid.NewGuid().ToString(); * aiResponse.Lang = agent.Language; * aiResponse.Status = new AIResponseStatus { }; * aiResponse.SessionId = AiConfig.SessionId; * aiResponse.Timestamp = DateTime.UtcNow; * * var intentResponse = RasaRequestExtension.HandleIntentPerContextIn(agent, AiConfig, request, result.Data, dc); * * RasaRequestExtension.HandleParameter(agent, intentResponse, response, request); * * RasaRequestExtension.HandleMessage(intentResponse); * * aiResponse.Result = new AIResponseResult * { * Source = "agent", * ResolvedQuery = request.Query.First(), * Action = intentResponse?.Action, * Parameters = intentResponse?.Parameters?.ToDictionary(x => x.Name, x => (object)x.Value), * Score = response.Intent.Confidence, * Metadata = new AIResponseMetadata { IntentId = intentResponse?.IntentId, IntentName = intentResponse?.IntentName }, * Fulfillment = new AIResponseFulfillment * { * Messages = intentResponse?.Messages?.Select(x => { * if (x.Type == AIResponseMessageType.Custom) * { * return (new * { * x.Type, * Payload = JsonConvert.DeserializeObject(x.PayloadJson) * }) as Object; * } * else * { * return (new { x.Type, x.Speech }) as Object; * } * * }).ToList() * } * }; * * RasaRequestExtension.HandleContext(dc, AiConfig, intentResponse, aiResponse); * * Console.WriteLine(JsonConvert.SerializeObject(aiResponse.Result));*/ return(aiResponse); }
public override async Task <TResult> AssembleResult <TResult>(AiResponse response) { var intent = Agent.Intents.Find(x => x.Name == response.Intent); var presetResponse = intent.Responses.FirstOrDefault(); // format messages presetResponse.Messages = presetResponse.Messages.Where(x => x.Speech.Length > 0).ToList(); if (presetResponse.Messages.Count == 0) { presetResponse.Messages.Add(new IntentResponseMessage { Speech = "\"" + intent.Name + "\"" }); } // fill parameters presetResponse.Parameters.ForEach(p => { var entity = response.Entities.FirstOrDefault(x => x.Entity == p.DataType); p.Value = entity?.Value; }); var matches = Regex.Matches(presetResponse.Messages.Random().Speech, "\".*?\"").Cast <Match>(); var speech = matches.ToList().Random(); var aiResponse = new AIResponseResult { ResolvedQuery = response.ResolvedQuery, Action = presetResponse.Action, Metadata = new AIResponseMetadata { IntentName = response.Intent }, Fulfillment = new AIResponseFulfillment { Messages = presetResponse.Messages.ToList <object>(), Speech = speech.Value.Substring(1, speech.Length - 2) }, Score = response.Score, Source = response.Source, Parameters = presetResponse.Parameters.Where(x => !String.IsNullOrEmpty(x.Value)).ToDictionary(item => item.Name, item => (object)item.Value) }; return((TResult)(object)aiResponse); }
public virtual async Task <TResult> AssembleResult <TResult>(AiRequest request, AiResponse response) { throw new NotImplementedException(); }
public virtual async Task <TResult> TextRequest <TResult>(AiRequest request) { // merge last contexts string contextHash = await GetContextsHash(request); Console.WriteLine($"TextRequest: {request.Text}, {request.Contexts}, {request.SessionId}"); // Load agent var projectPath = Path.Combine(AppDomain.CurrentDomain.GetData("DataPath").ToString(), "Projects", request.AgentId); var model = Directory.GetDirectories(projectPath).Where(x => x.Contains("model_")).Last().Split(Path.DirectorySeparatorChar).Last(); var modelPath = Path.Combine(projectPath, model); request.AgentDir = projectPath; request.Model = model + $"{Path.DirectorySeparatorChar}{contextHash}"; Agent = await GetAgentById(request.AgentId); var preditor = new BotPredictor(); var doc = await preditor.Predict(Agent, request); var predictedIntent = doc.Sentences[0].Intent; if (predictedIntent.Confidence < Agent.MlConfig.MinConfidence) { predictedIntent = await FallbackResponse(request); predictedIntent.Confidence = Agent.MlConfig.MinConfidence; predictedIntent.Label = "fallback"; Agent.Intents.Add(new Intent { Name = predictedIntent.Label, Responses = new List <IntentResponse> { new IntentResponse { IntentName = predictedIntent.Label, Messages = new List <IntentResponseMessage> { new IntentResponseMessage { Speech = "\"" + predictedIntent.Text + "\"", Type = AIResponseMessageType.Text } } } } }); } var aiResponse = new AiResponse { ResolvedQuery = request.Text, Score = predictedIntent.Confidence, Source = predictedIntent.Classifier, Intent = predictedIntent.Label, Entities = doc.Sentences[0].Entities }; Console.WriteLine($"TextResponse: {aiResponse.Intent}, {request.SessionId}"); return(await AssembleResult <TResult>(request, aiResponse)); }
public override async Task <TResult> AssembleResult <TResult>(AiRequest request, AiResponse response) { var intent = Agent.Intents.Find(x => x.Name == response.Intent); var presetResponse = intent.Responses.FirstOrDefault(); // format messages presetResponse.Messages = presetResponse.Messages.Where(x => x.Speech.Length > 0).ToList(); if (presetResponse.Messages.Count == 0) { presetResponse.Messages.Add(new IntentResponseMessage { Speech = "\"" + intent.Name + "\"" }); } // fill parameters presetResponse.Parameters.ForEach(p => { var entity = response.Entities.FirstOrDefault(x => x.Entity == p.DataType); p.Value = entity?.Value; }); var matches = Regex.Matches(presetResponse.Messages.Random().Speech, "\".*?\"").Cast <Match>(); var speech = matches.Count() == 0 ? String.Empty : matches.ToList().Random().Value; var contexts = HandleContexts(request.SessionId, presetResponse); throw new NotImplementedException("AssembleResult"); /*var aiResponse = new AIResponseResult * { * ResolvedQuery = response.ResolvedQuery, * Action = presetResponse.Action, * Metadata = new AIResponseMetadata * { * IntentName = response.Intent * }, * Intent = response.Intent, * Fulfillment = new AIResponseFulfillment * { * Messages = presetResponse.Messages.ToList<object>(), * Speech = speech.Length > 1 ? speech.Substring(1, speech.Length - 2) : String.Empty * }, * Score = response.Score, * Source = response.Source, * Contexts = contexts.ToArray(), * Parameters = presetResponse.Parameters.Where(x => !String.IsNullOrEmpty(x.Value)).ToDictionary(item => item.Name, item => (object)item.Value) * }; * * return (TResult)(object)aiResponse;*/ }
public static void HandleContext(Database dc, AiRequest aiRequest, IntentResponse intentResponse, AiResponse aiResponse) { if (intentResponse == null) { return; } // Merge context lifespan // override if exists, otherwise add, delete if lifespan is zero dc.DbTran(() => { var sessionContexts = dc.Table <ConversationContext>().Where(x => x.ConversationId == aiRequest.SessionId).ToList(); // minus 1 round sessionContexts.Where(x => !intentResponse.Contexts.Select(ctx => ctx.Name).Contains(x.Context)) .ToList() .ForEach(ctx => ctx.Lifespan = ctx.Lifespan - 1); intentResponse.Contexts.ForEach(ctx => { var session1 = sessionContexts.FirstOrDefault(x => x.Context == ctx.Name); if (session1 != null) { if (ctx.Lifespan == 0) { dc.Table <ConversationContext>().Remove(session1); } else { session1.Lifespan = ctx.Lifespan; } } else { dc.Table <ConversationContext>().Add(new ConversationContext { ConversationId = aiRequest.SessionId, Context = ctx.Name, Lifespan = ctx.Lifespan }); } }); }); /*aiResponse.Result.Contexts = dc.Table<ConversationContext>() * .Where(x => x.Lifespan > 0 && x.ConversationId == AiConfig.SessionId) * .Select(x => new AIContext { Name = x.Context.ToLower(), Lifespan = x.Lifespan }) * .ToArray();*/ }