Scrittura del Contesto - RetiSpA/botler GitHub Wiki
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);
}
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.