From bbf1f19310b1cf2daf0780eeed811061fe333d4a Mon Sep 17 00:00:00 2001 From: Ryanba <92616678+Gujiassh@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:48:31 +0800 Subject: [PATCH] fix(telegram-bot): guard structured message fallback (#1162) --- .../telegram/agent/actions/send-message.test.ts | 12 ++++++++++++ .../bots/telegram/agent/actions/send-message.ts | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/services/telegram-bot/src/bots/telegram/agent/actions/send-message.test.ts b/services/telegram-bot/src/bots/telegram/agent/actions/send-message.test.ts index da9258018..b765d4915 100644 --- a/services/telegram-bot/src/bots/telegram/agent/actions/send-message.test.ts +++ b/services/telegram-bot/src/bots/telegram/agent/actions/send-message.test.ts @@ -33,6 +33,18 @@ describe('parseMayStructuredMessage', () => { expect(result).toMatchObject({ messages: ['Hello, world!', 'Hello, world!'], reply_to_message_id: '1234567890' }) }) + it('should fall back to the original text when structured output omits messages', () => { + const text = '{"reply_to_message_id":"1234567890"}' + const result = parseMayStructuredMessage(text) + expect(result).toMatchObject({ messages: [text], reply_to_message_id: '1234567890' }) + }) + + it('should fall back to the original text when structured output uses a non-array messages field', () => { + const text = '{"messages":"Hello, world!"}' + const result = parseMayStructuredMessage(text) + expect(result).toMatchObject({ messages: [text], reply_to_message_id: undefined }) + }) + it('should return an array of messages from multi-line elements of input', () => { const result = parseMayStructuredMessage(`{"messages": [ "Hello, diff --git a/services/telegram-bot/src/bots/telegram/agent/actions/send-message.ts b/services/telegram-bot/src/bots/telegram/agent/actions/send-message.ts index b5af46ed6..510800166 100644 --- a/services/telegram-bot/src/bots/telegram/agent/actions/send-message.ts +++ b/services/telegram-bot/src/bots/telegram/agent/actions/send-message.ts @@ -25,10 +25,19 @@ export function parseMayStructuredMessage(responseText: string) { if (result) { logger.withField('text', JSON.stringify(responseText)).withField('result', result).log('Multiple messages detected') - const parsedResponse = parse(result?.[0]) as ({ messages?: string[], reply_to_message_id?: string } | undefined) - parsedResponse.messages = parsedResponse.messages?.filter(message => message.trim() !== '') + const parsedResponse = parse(result[0]) as ({ messages?: unknown, reply_to_message_id?: unknown } | undefined) + const messages = Array.isArray(parsedResponse?.messages) + ? parsedResponse.messages.filter((message): message is string => typeof message === 'string' && message.trim() !== '') + : [] + const replyToMessageId = typeof parsedResponse?.reply_to_message_id === 'string' + ? parsedResponse.reply_to_message_id + : undefined - return parsedResponse + if (messages.length > 0) { + return { messages, reply_to_message_id: replyToMessageId } + } + + return { messages: [responseText], reply_to_message_id: replyToMessageId } } return { messages: [responseText], reply_to_message_id: undefined }