( messages: Message[], )
| 4873 | messages: Message[], |
| 4874 | ): Message[] |
| 4875 | export function filterWhitespaceOnlyAssistantMessages( |
| 4876 | messages: Message[], |
| 4877 | ): Message[] { |
| 4878 | let hasChanges = false |
| 4879 | |
| 4880 | const filtered = messages.filter(message => { |
| 4881 | if (message.type !== 'assistant') { |
| 4882 | return true |
| 4883 | } |
| 4884 | |
| 4885 | const content = message.message.content |
| 4886 | // Keep messages with empty arrays (handled elsewhere) or that have real content |
| 4887 | if (!Array.isArray(content) || content.length === 0) { |
| 4888 | return true |
| 4889 | } |
| 4890 | |
| 4891 | if (hasOnlyWhitespaceTextContent(content)) { |
| 4892 | hasChanges = true |
| 4893 | logEvent('tengu_filtered_whitespace_only_assistant', { |
| 4894 | messageUUID: |
| 4895 | message.uuid as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, |
| 4896 | }) |
| 4897 | return false |
| 4898 | } |
| 4899 | |
| 4900 | return true |
| 4901 | }) |
| 4902 | |
| 4903 | if (!hasChanges) { |
| 4904 | return messages |
| 4905 | } |
| 4906 | |
| 4907 | // Removing assistant messages may leave adjacent user messages that need |
| 4908 | // merging (the API requires alternating user/assistant roles). |
| 4909 | const merged: Message[] = [] |
| 4910 | for (const message of filtered) { |
| 4911 | const prev = merged.at(-1) |
| 4912 | if (message.type === 'user' && prev?.type === 'user') { |
| 4913 | merged[merged.length - 1] = mergeUserMessages(prev, message) // lvalue |
| 4914 | } else { |
| 4915 | merged.push(message) |
| 4916 | } |
| 4917 | } |
| 4918 | return merged |
| 4919 | } |
| 4920 | |
| 4921 | /** |
| 4922 | * Ensure all non-final assistant messages have non-empty content. |
no test coverage detected