Skip to content

Commit

Permalink
Make recording state part of the conversation state
Browse files Browse the repository at this point in the history
Ie, if recording is enabled/disabled for a conversation, save that
persistently.
  • Loading branch information
gcampax committed Nov 30, 2021
1 parent 37681f0 commit 4e400f1
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 21 deletions.
7 changes: 4 additions & 3 deletions lib/dialogue-agent/assistant_dispatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,12 +323,13 @@ export default class AssistantDispatcher extends events.EventEmitter {
return ref;
}

private async getConversationState(conversationId : string) {
private async getConversationState(conversationId : string) : Promise<ConversationState|undefined> {
const state = await this._conversationStateDB.getOne(conversationId).then((row) => {
if (row) {
return {
dialogueState : row.dialogueState ? JSON.parse(row.dialogueState) : null,
lastMessageId : row.lastMessageId ? row.lastMessageId : 0
dialogueState: row.dialogueState ? JSON.parse(row.dialogueState) : null,
lastMessageId: row.lastMessageId || 0,
recording: row.recording || false,
};
}
return undefined;
Expand Down
35 changes: 21 additions & 14 deletions lib/dialogue-agent/conversation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ export interface ConversationOptions {
highConfidence ?: number;
lowConfidence ?: number;
}>;
syncDevices ?: boolean;
}

interface Statistics {
Expand All @@ -79,6 +78,7 @@ export interface ConversationDelegate {
export interface ConversationState {
dialogueState : Record<string, unknown>;
lastMessageId : number;
recording : boolean;
}

/**
Expand All @@ -96,7 +96,7 @@ export default class Conversation extends events.EventEmitter {
_ : (x : string) => string;

private _stats : Statistics;
private _options : ConversationOptions;
private _options : Readonly<ConversationOptions>;
private _debug : boolean;
private _dialogueFlags : Record<string, boolean>;
rng : () => number;
Expand All @@ -114,6 +114,7 @@ export default class Conversation extends events.EventEmitter {
private _lastMessageId : number;
private _contextResetTimeout : NodeJS.Timeout|null;
private _contextResetTimeoutSec : number;
private _recording : boolean;

private _log : ConversationLogger;
private readonly _conversationStateDB : LocalTable<ConversationStateRow>;
Expand All @@ -138,6 +139,7 @@ export default class Conversation extends events.EventEmitter {
this._options = options;
this._debug = !!this._options.debug;
this._dialogueFlags = options.dialogueFlags || {};
this._recording = options.log ?? false;

this.rng = options.rng || Math.random;

Expand Down Expand Up @@ -179,20 +181,22 @@ export default class Conversation extends events.EventEmitter {
}

get inRecordingMode() : boolean {
return !!this._options.log;
return this._recording;
}

get dialogueFlags() : Record<string, boolean> {
return this._dialogueFlags;
}

startRecording() {
this._options.log = true;
async startRecording() {
this._recording = true;
await this._saveState();
}

async endRecording() {
await this._log.dialogueFinished();
this._options.log = false;
this._recording = false;
await this._saveState();
}

notify(app : AppExecutor, outputType : string, outputValue : Record<string, unknown>) {
Expand All @@ -215,8 +219,10 @@ export default class Conversation extends events.EventEmitter {
await this._history.init();
this._resetInactivityTimeout();

if (state)
if (state) {
this._lastMessageId = state.lastMessageId;
this._recording = state.recording;
}
this._started = true;

return this._loop.start(!!this._options.showWelcome,
Expand Down Expand Up @@ -302,17 +308,17 @@ export default class Conversation extends events.EventEmitter {
await this._history.addMessage(msg);
await this._callDelegates((out) => out.addMessage(msg));

await this.saveState(msg.id);
await this._saveState();
}

private async saveState(lastMessageId : number) {
private async _saveState() {
const serializedDialogueState = JSON.stringify(this._loop.getState());
console.log(`Saving conversation state for ${this._conversationId} (${serializedDialogueState.length} characters)`);
const row = {
await this._conversationStateDB.insertOne(this._conversationId, {
dialogueState: serializedDialogueState,
lastMessageId: lastMessageId,
};
await this._conversationStateDB.insertOne(this._conversationId, row);
lastMessageId: this._lastMessageId,
recording: this._recording,
});
}

/**
Expand All @@ -324,7 +330,8 @@ export default class Conversation extends events.EventEmitter {
getState() : ConversationState {
return {
dialogueState: this._loop.getState(),
lastMessageId: this._lastMessageId
lastMessageId: this._lastMessageId,
recording: this._recording,
};
}

Expand Down
1 change: 1 addition & 0 deletions lib/engine/db/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export interface ConversationStateRow {
uniqueId : string;
dialogueState : string|null;
lastMessageId : number;
recording : boolean;
}

export interface ConversationHistoryRow {
Expand Down
5 changes: 5 additions & 0 deletions lib/engine/db/sqlite/migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,11 @@ function migrateTo12(db : sqlite3.Database) {
// sqlite doesn't support dropping columns
//db.run(`alter table conversation_state drop column history`);
});
},
function migrateTo13(db : sqlite3.Database) {
db.serialize(() => {
db.run('alter table conversation_state add column recording boolean default false');
});
}];
const currentVersion = MIGRATIONS.length;

Expand Down
3 changes: 2 additions & 1 deletion lib/engine/db/sqlite/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ drop table if exists conversation_state;
create table conversation_state (
uniqueId varchar(255) primary key,
dialogueState text default null,
lastMessageId int(11) default null
lastMessageId int(11) default null,
recording boolean default false
);

create table conversation_history (
Expand Down
6 changes: 3 additions & 3 deletions tool/interactive-annotate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import AbstractDialogueAgent from '../lib/dialogue-agent/abstract_dialogue_agent
import ExecutionDialogueAgent from '../lib/dialogue-agent/execution_dialogue_agent';
import DialoguePolicy from '../lib/dialogue-agent/dialogue_policy';
import ValueCategory from '../lib/dialogue-agent/value-category';
import { ConversationState } from '../lib/dialogue-agent/conversation';
import Engine from '../lib/engine';
import * as I18n from '../lib/i18n';

Expand Down Expand Up @@ -230,12 +231,11 @@ class Annotator extends events.EventEmitter {
return {
id: 'main',

getState() {
getState() : ConversationState {
return {
history: [],
dialogueState: {},
lastMessageId: 0,
expected: null
recording: false,
};
}
};
Expand Down

0 comments on commit 4e400f1

Please sign in to comment.