Skip to content

Commit 98e84f8

Browse files
author
Roman Snapko
authored
Add user prompt to sanitized messages for chat name generation (#2081)
Fixes OPS-3644 Based on the error, the last message in the conversation needs to have `user` role
1 parent b3ee0d1 commit 98e84f8

2 files changed

Lines changed: 92 additions & 2 deletions

File tree

packages/server/api/src/app/ai/chat/utils.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,26 @@ export function sanitizeMessagesForChatName(
9898
return null;
9999
};
100100

101-
return messages
101+
const sanitized = messages
102102
.filter(isSupportedRole)
103103
.map((m) => {
104104
const text = extractText(m.content);
105105
return text ? ({ role: m.role, content: text } as ModelMessage) : null;
106106
})
107107
.filter((m): m is ModelMessage => m !== null);
108+
109+
if (sanitized.length === 0) {
110+
return sanitized;
111+
}
112+
113+
if (sanitized[sanitized.length - 1].role === 'assistant') {
114+
sanitized.push({
115+
role: 'user',
116+
content: 'Generate a chat name based on the conversation above.',
117+
});
118+
}
119+
120+
return sanitized;
108121
}
109122

110123
function isToolMessage(msg: ModelMessage): boolean {

packages/server/api/test/unit/ai/utils.test.ts

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,10 @@ describe('sanitizeMessagesForChatName', () => {
927927
expect(result).toEqual([
928928
{ role: 'user', content: 'hello' },
929929
{ role: 'assistant', content: 'hi' },
930+
{
931+
role: 'user',
932+
content: 'Generate a chat name based on the conversation above.',
933+
},
930934
]);
931935
});
932936

@@ -937,7 +941,13 @@ describe('sanitizeMessagesForChatName', () => {
937941
];
938942

939943
const result = sanitizeMessagesForChatName(messages);
940-
expect(result).toEqual([{ role: 'assistant', content: 'answer' }]);
944+
expect(result).toEqual([
945+
{ role: 'assistant', content: 'answer' },
946+
{
947+
role: 'user',
948+
content: 'Generate a chat name based on the conversation above.',
949+
},
950+
]);
941951
});
942952

943953
it('merges multiple text parts with newlines and trims overall', () => {
@@ -970,6 +980,10 @@ describe('sanitizeMessagesForChatName', () => {
970980
const result = sanitizeMessagesForChatName(messages);
971981
expect(result).toEqual([
972982
{ role: 'assistant', content: 'Only this is kept' },
983+
{
984+
role: 'user',
985+
content: 'Generate a chat name based on the conversation above.',
986+
},
973987
]);
974988
});
975989

@@ -983,4 +997,67 @@ describe('sanitizeMessagesForChatName', () => {
983997
const result = sanitizeMessagesForChatName(messages);
984998
expect(result).toEqual([]);
985999
});
1000+
1001+
it('appends user prompt when last message is from assistant', () => {
1002+
const messages: ModelMessage[] = [
1003+
{ role: 'user', content: 'What is the weather?' },
1004+
{ role: 'assistant', content: 'Let me check that for you.' },
1005+
];
1006+
1007+
const result = sanitizeMessagesForChatName(messages);
1008+
expect(result).toEqual([
1009+
{ role: 'user', content: 'What is the weather?' },
1010+
{ role: 'assistant', content: 'Let me check that for you.' },
1011+
{
1012+
role: 'user',
1013+
content: 'Generate a chat name based on the conversation above.',
1014+
},
1015+
]);
1016+
});
1017+
1018+
it('does not append user prompt when last message is from user', () => {
1019+
const messages: ModelMessage[] = [
1020+
{ role: 'assistant', content: 'How can I help you?' },
1021+
{ role: 'user', content: 'Tell me a joke' },
1022+
];
1023+
1024+
const result = sanitizeMessagesForChatName(messages);
1025+
expect(result).toEqual([
1026+
{ role: 'assistant', content: 'How can I help you?' },
1027+
{ role: 'user', content: 'Tell me a joke' },
1028+
]);
1029+
});
1030+
1031+
it('does not append user prompt when result is empty', () => {
1032+
const messages: ModelMessage[] = [
1033+
{ role: 'system', content: 'system message' },
1034+
];
1035+
1036+
const result = sanitizeMessagesForChatName(messages);
1037+
expect(result).toEqual([]);
1038+
});
1039+
1040+
it('appends user prompt after trimming and filtering', () => {
1041+
const messages: ModelMessage[] = [
1042+
{ role: 'user', content: ' hello ' },
1043+
{ role: 'system', content: 'system' },
1044+
{
1045+
role: 'assistant',
1046+
content: [
1047+
{ type: 'text', text: 'response' } as any,
1048+
{ type: 'tool-call', toolName: 'search' } as any,
1049+
],
1050+
},
1051+
];
1052+
1053+
const result = sanitizeMessagesForChatName(messages);
1054+
expect(result).toEqual([
1055+
{ role: 'user', content: 'hello' },
1056+
{ role: 'assistant', content: 'response' },
1057+
{
1058+
role: 'user',
1059+
content: 'Generate a chat name based on the conversation above.',
1060+
},
1061+
]);
1062+
});
9861063
});

0 commit comments

Comments
 (0)