diff --git a/API.md b/API.md index 14cf3ae..c4e7c61 100644 --- a/API.md +++ b/API.md @@ -300,7 +300,7 @@ The store is exposed as a `LibDashStore` instance (see `src/index.js`). Each met - [modelconversation](API.modelconversation.md) - `create(googleAuthId: number, input: {provider: string, model: string, started_by?: number|null}, tx?: object): Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null}>` - `delete(googleAuthId: number, conversationId: number, tx?: object): Promise` - - `get(googleAuthId: number, conversationId: number, tx?: object): Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null}>` + - `get(googleAuthId: number, conversationId: number, tx?: object): Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null, first_user_message: string|null}>` - `list(googleAuthId: number, tx?: object): Promise>` - `setState(googleAuthId: number, conversationId: number, state: string, tx?: object): Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null}>` - [modelmessage](API.modelmessage.md) diff --git a/API.modelconversation.md b/API.modelconversation.md index c5d8e38..15b414b 100644 --- a/API.modelconversation.md +++ b/API.modelconversation.md @@ -71,7 +71,7 @@ Gets a single model conversation by ID for the user in the selected company. **Returns** -`Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null}>` +`Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null, first_user_message: string|null}>` — `first_user_message` is the stored `message` payload of the first `user` message (null if none yet). **Throws** diff --git a/scripts/test-modelconversation.js b/scripts/test-modelconversation.js index e512104..02f2f55 100644 --- a/scripts/test-modelconversation.js +++ b/scripts/test-modelconversation.js @@ -67,6 +67,7 @@ async function run() { assert.deepEqual(msgs.map((m) => m.message), ['hello', 'echo: hello', 'second']); assert.deepEqual(msgs.map((m) => m.role), ['user', 'assistant', 'user']); assert.equal((await store.modelconversation.list(userA)).find((c) => c.id === conv.id).first_user_message, 'hello'); + assert.equal((await store.modelconversation.get(userA, conv.id)).first_user_message, 'hello'); // Other user cannot see or write const userB = await store.google_auth.add('mc-b@example.com'); diff --git a/src/providers/mssql/queries/modelconversation.js b/src/providers/mssql/queries/modelconversation.js index 5ee2086..1e5a391 100644 --- a/src/providers/mssql/queries/modelconversation.js +++ b/src/providers/mssql/queries/modelconversation.js @@ -9,9 +9,8 @@ export const MODELCONVERSATION_COLUMNS = ` started_by `; -export const LIST_BY_COMPANYUSER = ` -SELECT -${MODELCONVERSATION_COLUMNS}, +/** Raw stored payload of the conversation's first `user` message; `c` is the conversation alias. */ +const FIRST_USER_MESSAGE_COLUMN = ` ( SELECT m.message FROM modelmessage m @@ -21,6 +20,12 @@ ${MODELCONVERSATION_COLUMNS}, WHERE f.conversation_id = c.id AND f.role = 'user' ) ) AS first_user_message +`; + +export const LIST_BY_COMPANYUSER = ` +SELECT +${MODELCONVERSATION_COLUMNS}, +${FIRST_USER_MESSAGE_COLUMN} FROM modelconversation c WHERE c.companyuser_id = @companyuserId ORDER BY c.updated_at DESC, c.id DESC @@ -28,9 +33,10 @@ ORDER BY c.updated_at DESC, c.id DESC export const GET_BY_COMPANYUSER_AND_ID = ` SELECT -${MODELCONVERSATION_COLUMNS} -FROM modelconversation -WHERE id = @id AND companyuser_id = @companyuserId +${MODELCONVERSATION_COLUMNS}, +${FIRST_USER_MESSAGE_COLUMN} +FROM modelconversation c +WHERE c.id = @id AND c.companyuser_id = @companyuserId `; export const CREATE = ` diff --git a/src/store/modelconversation/get.js b/src/store/modelconversation/get.js index a259b95..73cac2e 100644 --- a/src/store/modelconversation/get.js +++ b/src/store/modelconversation/get.js @@ -14,7 +14,7 @@ export default function get(provider) { * @param {number} googleAuthId - The id of the Google auth user. * @param {number} conversationId - The conversation id. * @param {object} [tx] - Optional transaction to run within. - * @returns {Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null}>} + * @returns {Promise<{id: number, companyuser_id: number, provider: string, model: string, created_at: string, updated_at: string, state: string, started_by: number|null, first_user_message: string|null}>} `first_user_message` is the stored `message` payload of the first `user` message (null if none yet). * @throws {Error} 'Conversation not found'. */ return async (googleAuthId, conversationId, tx) => { @@ -28,6 +28,6 @@ export default function get(provider) { const result = await runner.query(sql, { id, companyuserId }); if (!result.rows[0]) throw new Error('Conversation not found'); - return shape(result.rows[0]); + return { ...shape(result.rows[0]), first_user_message: result.rows[0].first_user_message ?? null }; }; }