Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 public virtual async Task <TResult> AssembleResult <TResult>(AiRequest request, AiResponse response)
 {
     throw new NotImplementedException();
 }
Esempio n. 5
0
        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();*/
        }