* Filter trailing thinking blocks from the last message if it's an assistant message. * The API doesn't allow assistant messages to end with thinking/redacted_thinking blocks.
( messages: (UserMessage | AssistantMessage)[], )
| 4779 | * The API doesn't allow assistant messages to end with thinking/redacted_thinking blocks. |
| 4780 | */ |
| 4781 | function filterTrailingThinkingFromLastAssistant( |
| 4782 | messages: (UserMessage | AssistantMessage)[], |
| 4783 | ): (UserMessage | AssistantMessage)[] { |
| 4784 | const lastMessage = messages.at(-1) |
| 4785 | if (!lastMessage || lastMessage.type !== 'assistant') { |
| 4786 | // Last message is not assistant, nothing to filter |
| 4787 | return messages |
| 4788 | } |
| 4789 | |
| 4790 | const content = lastMessage.message.content |
| 4791 | const lastBlock = content.at(-1) |
| 4792 | if (!lastBlock || !isThinkingBlock(lastBlock)) { |
| 4793 | return messages |
| 4794 | } |
| 4795 | |
| 4796 | // Find last non-thinking block |
| 4797 | let lastValidIndex = content.length - 1 |
| 4798 | while (lastValidIndex >= 0) { |
| 4799 | const block = content[lastValidIndex] |
| 4800 | if (!block || !isThinkingBlock(block)) { |
| 4801 | break |
| 4802 | } |
| 4803 | lastValidIndex-- |
| 4804 | } |
| 4805 | |
| 4806 | logEvent('tengu_filtered_trailing_thinking_block', { |
| 4807 | messageUUID: |
| 4808 | lastMessage.uuid as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, |
| 4809 | blocksRemoved: content.length - lastValidIndex - 1, |
| 4810 | remainingBlocks: lastValidIndex + 1, |
| 4811 | }) |
| 4812 | |
| 4813 | // Insert placeholder if all blocks were thinking |
| 4814 | const filteredContent = |
| 4815 | lastValidIndex < 0 |
| 4816 | ? [{ type: 'text' as const, text: '[No message content]', citations: [] }] |
| 4817 | : content.slice(0, lastValidIndex + 1) |
| 4818 | |
| 4819 | const result = [...messages] |
| 4820 | result[messages.length - 1] = { |
| 4821 | ...lastMessage, |
| 4822 | message: { |
| 4823 | ...lastMessage.message, |
| 4824 | content: filteredContent, |
| 4825 | }, |
| 4826 | } |
| 4827 | return result |
| 4828 | } |
| 4829 | |
| 4830 | /** |
| 4831 | * Check if an assistant message has only whitespace-only text content blocks. |
no test coverage detected