Scrittura del Contesto - RetiSpA/botler GitHub Wiki

Scrittura del Contesto

Vediamo nel dettaglio quando e come viene scritto un contesto nel CosmoDB.

Il Contesto viene salvato ad ogni turno, fatta eccezione se viene riconosciuto:

  • Un comando rapido
  • Un interruzione di conversazione
  • Una domanda presente nel QnA (pubblico o privato).

Viene creato e salvato alla fine di un ogni turno, nel metodo:

        /// <summary>
        /// Create a response for the current turn  checking the LuisResult and bot state context
        /// </summary>
        /// <param name="luisServiceResult"> LuisResult and all the entities found </param>
        /// <returns></returns>
        private async Task CreateScenarioResponseWithLuisAsync(LuisServiceResult luisServiceResult)
        {
            IScenario currentScenario = await ScenarioRecognizer.ExtractCurrentScenarioAsync(luisServiceResult, _accessors, currentTurn);

            // * Gestisce lo scenario in base al suo contesto  * //
            await currentScenario.HandleScenarioStateAsync(currentTurn, _accessors, luisServiceResult);

            // * Salva lo stato di questo turno nel cosmbosDB * //
            await BotStateBuilder.BuildAndSaveBotStateContextContext(currentTurn, _accessors, luisServiceResult, currentScenario);

            // * Salva lo stato nel MemoryStorage * //
            await _accessors.SaveStateAsync(currentTurn);
        }

Classe BotStateBuilder

Questa classe si occupa di costruire e salvare nel CosmoDB il JSON serializzato dalla classe BotStateContext.

  public async static Task<BotStateContext> BuildAndSaveBotStateContextContext(ITurnContext turn, BotlerAccessors accessors, LuisServiceResult luisServiceResult, IScenario scenario)
        {
            BotStateContext state = new BotStateContext();
            var score = luisServiceResult.TopScoringIntent.Item2;

            state.Turn = await accessors.GetCurretTurnCounterAsync(turn);
            state.UserQuery = turn.Activity.Text;
            state.Conversation_ID = turn.Activity.From.Id;
            state.scenarioID = scenario.ScenarioID;

            if (scenario.ScenarioIntent is null)
            {
                state.TopIntent = IntentFactory.FactoryMethod(luisServiceResult);
                state.TopIntent.EntitiesCollected = luisServiceResult.AllEntitiesFromLuis;
            }
            else
            {
                state.TopIntent = scenario.ScenarioIntent;
                state.TopIntent.EntitiesCollected = scenario.ScenarioIntent.EntitiesCollected;
            }

            await accessors.MongoDB.InsertJSONContextDocAsync(state);
            var json = JsonConvert.SerializeObject(state);
            return state;
        }

Molto semplicemente, prende le informazioni passate dalla firma del metodo, e una volta creato chiama il servizio MongoDB che si occuperà di creare una connessione con il DB e serializzare la classe e infine ovviamente inserirla.

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