Lettura del Contesto - RetiSpA/botler GitHub Wiki

Lettura del Contesto

La lettura del contesto avviene invece nel classe BotStateContextController, questa classe viene chiamata dallo ScenarioRecognizer, quando viene incontrato uno Scenario non propriamente riconosciuto, e quindi c'è bisogno di leggere i contesti precedenti per continuare la conversazione.

Metodo principale del BotStateContextController

In questo metodo viene letto l'ultimo contesto presente nel CosmoDB dell'attuale conversazione, e in base al tipo di scenario si eseguirano determinate azioni.

        public async static Task<IScenario> CheckBotState(IScenario scenario, BotlerAccessors accessors, ITurnContext turn, LuisServiceResult luisServiceResult)
        {
            var lastBotContext = await FindLastUsefulContextAsync(accessors, turn, scenario);
            IScenario lastUsefulScenario = null;

            if (lastBotContext != null)
            {
                lastUsefulScenario = ScenarioFactory.FactoryMethod(accessors, turn, lastBotContext.scenarioID, lastBotContext.TopIntent);
            }

            var userQuery = turn.Activity.Text;

            // * (4) * // No context found
            if (lastUsefulScenario is null)
            {
                return scenario;
            }

            // * (1) * // Authentication Phase.
            if (AuthenticationHelper.MagicCodeFound(turn.Activity.Text) && lastUsefulScenario.ScenarioID.Equals(Autenticazione))
            {
                return ScenarioFactory.FactoryMethod(accessors, turn, Autenticazione, null);
            }

            // * (2) * // Asking the user for more info or continue/begin a dialog
            if (ExecutionScenarios.Contains(lastUsefulScenario.ScenarioID))
            {
                scenario = await CheckLastExecutionScenario(scenario, (ExecutionScenario) lastUsefulScenario, userQuery,  lastBotContext.UserQuery, accessors, turn,
                    luisServiceResult);
            }

             // * (3) * // Not enough entities to complete the user query.
            if (DescriptionScenarios.Contains(lastUsefulScenario.ScenarioID))
            {
                scenario = CheckLastDescriptionScenario(scenario, (DescriptionScenario) lastUsefulScenario, accessors, turn, luisServiceResult);
            }

            return scenario;
        }

Il contesto del bot viene ritornato dal metodo :

       public static async Task<BotStateContext> FindLastUsefulContextAsync(BotlerAccessors accessors, ITurnContext turn, IScenario scenario)
        {
            string scenarioID = scenario.ScenarioID;
            string convID = turn.Activity.From.Id;
            MongoDBService MongoDB = new MongoDBService();
            IList<BotStateContext> list = await MongoDB.GetAllBotStateByConvIDAsync(convID);

            foreach(var bs in list)
            {
                if ((ExecutionScenarios.Contains(bs.scenarioID) || (DescriptionScenarios.Contains(bs.scenarioID))) && scenario.ScenarioID.Equals(Default))
                {
                    var json = (JsonConvert.SerializeObject(bs));
                    return bs;
                }
            }

            return null; // No context found
        }

Il quale controllare se in questa conversazione è stato creato uno contesto diverso dallo Scenario Default, il quale è uno scenario dove non vengono eseguite azioni o raccolte entità, percui la conversazione manca di contesto, se non viene trovato uno scenario Esecutivo o Descrittivo.

Leggendo lo scenario si leggerano anche le entità raccolte in precedenza e si deciderà in base a queste se continuare la raccolta di entità o l'esecuzione dell'intento e quindi del dialogo a lui collegato.

⚠️ **GitHub.com Fallback** ⚠️