@dialogai/telegram-client-dialog
Advanced tools
Comparing version 1.0.5 to 1.0.6
84
index.js
@@ -10,4 +10,6 @@ const { DynamicStructuredTool } = require("@langchain/core/tools"); | ||
/*try { | ||
/** | ||
try { | ||
// https://core.telegram.org/bots/api#editmessagereplymarkup | ||
// https://stackoverflow.com/questions/71234183/why-do-i-get-a-400-error-when-im-trying-to-edit-an-inline-keyboard-node-telegr | ||
await ctx.editMessageReplyMarkup({ | ||
@@ -41,16 +43,13 @@ inline_keyboard: [ | ||
let channel = await Channels.getChannelInfo(username); | ||
if (channel.is_valid) { | ||
dialog.response.post_message = { | ||
text: channel.get_link(), | ||
markup_data: ['Подписаться::tagged_action'] | ||
}; | ||
if (typeof dialog.storage.channels === 'undefined') dialog.storage.channels = []; | ||
dialog.storage.channels.push(channel.serialize()) | ||
} | ||
else return 'Канал или чат с таким именем не найден'; | ||
if (!channel.is_valid) return 'Канал или чат с таким именем не найден'; | ||
dialog.response.post_message = { | ||
text: channel.get_link(), | ||
markup_data: ['Подписаться::tagged_action'] | ||
}; | ||
if (typeof dialog.storage.channels === 'undefined') dialog.storage.channels = []; | ||
if (!dialog.storage.channels.some(ch => ch.username === username)) dialog.storage.channels.push(channel.serialize()) | ||
return ` | ||
Канал/чат "${channel.title}" найден. Нажмите кнопку "Подписаться" в следующем сообщении прямо в этом диалоге. | ||
После подписки вы можете в свободной форме озвучить пожелания по поводу того, как вы хотите воспользоваться этой подпиской. | ||
Вы можете ссылаться на этот канал/чат по его названию. | ||
` | ||
Канал/чат "${channel.title}" найден. Нажмите кнопку "Подписаться" в следующем сообщении прямо в этом диалоге без использования приложения Telegram. | ||
Вы можете настроить получение данных из этого канала/чата, озвучив свои пожелания в свободной форме. | ||
Вы можете ссылаться на этот канал/чат по его названию.` | ||
} catch (e) { | ||
@@ -66,2 +65,48 @@ logger.critical('JOIN TELEGRAM CHANNEL TOOL ERROR :: ', e.message, e?.stack); | ||
* | ||
* @param dialog {Dialog} | ||
* @returns {DynamicStructuredTool} | ||
*/ | ||
function get_define_request_tool(dialog) { | ||
if (typeof dialog.storage.channels === 'undefined') dialog.storage.channels = []; | ||
let channels = dialog.storage.channels.map(ch => `- "${ch.title}" (username: ${ch.username})`), | ||
sources = channels.length === 0 ? '' : '\nДоступные каналы и чаты:\n' + channels.join('\n'); | ||
return new DynamicStructuredTool({ | ||
name: 'define_request_tool', | ||
description: `Используется для уточнения, сохранения и выполнения запроса пользователя на получение данных из каналов и чатов мессенджера Telegram. | ||
Если в запросе пользователя не хватает каких-то данных, не пытайся подставить их сам, уточни у пользователя.`, | ||
schema: z.object({ | ||
channels_usernames: z.string().array().default([]) | ||
.describe(`Массив имен (username) каналов и чатов мессенджера Telegram, откуда нужно брать данные. | ||
Если пользователь не указал источники, оставь массив пустым.` + sources), | ||
regularity: z.enum(['single_request', 'on_source_updated', 'one_time_a_day']) | ||
.describe(`Регулярность получения данных по пользовательскому запросу: | ||
- единичный запрос пользователя (single_request), | ||
- выполнять запрос по мере получения новых данных из источников (on_source_updated) | ||
- или выполнять запрос один раз в день (one_time_a_day). | ||
Если пользователь не указал эти данные, уточни их у него.`), | ||
user_request: z.string() | ||
.describe(`Текст пользовательского запроса, по которому ведется поиск информации в каналах и чатах. | ||
Если пользователь не сформулировал запрос, или хочет просто получать данные об обновлениях, не заполняй это поле`), | ||
allow_telegraph: z.boolean().default(true) | ||
.describe('Можно ли использовать сервис telegra.ph для отображения результатов чтобы не засорять чат c ассистентом: да (true) или нет (false)') | ||
}), | ||
func: async ({channels_usernames = [], regularity = 'single_request', user_request, allow_telegraph = true}) => { | ||
console.log('DEFINE REQUEST TOOL IS INVOKED :: ', JSON.stringify({channels_usernames, regularity, user_request, allow_telegraph})); | ||
let reg = { | ||
single_request: 'единичный запрос', | ||
on_source_updated: 'выполнять запрос по мере получения новых данных из источников', | ||
one_time_a_day: 'выполнять запрос один раз в день' | ||
}, | ||
response = 'Сформирован следующий запрос:\n' + user_request || 'Получать все обновления\n' + | ||
'Регулярность: ' + reg[regularity] + '\n' + | ||
'Разрешить telegra.ph: ' + allow_telegraph + '\n' + | ||
'Источники: ' + channels_usernames.toLocaleString() + | ||
'Справочно: список доступных каналов и чатов:\n' + channels.join('\n'); | ||
return response; | ||
} | ||
}); | ||
} | ||
/** | ||
* | ||
* @param supervisor {DialogSupervisor} | ||
@@ -92,2 +137,3 @@ * @returns {Dialog} | ||
await dialog.restore(); | ||
let { message_id, text } = ctx?.update?.callback_query?.message, | ||
@@ -99,7 +145,5 @@ username = text.slice(text.lastIndexOf('/') + 1); | ||
s.subscription_date = Math.floor(Date.now() / 1000); | ||
console.log('BOT ACTION :: TAGGED ACTION:: CTX :: ', JSON.stringify(dialog.data())); | ||
dialog.store().then(() => console.log('TAGGED ACTION:: DIALOG DATA :: ', JSON.stringify(dialog.data()))) | ||
} | ||
let dialog = new Dialog({ | ||
@@ -116,2 +160,8 @@ alias: 'Телеграм-аналитик', | ||
}); | ||
dialog.callbacks = [ | ||
{ | ||
on_restore_end: async () => dialog.add_tool(get_define_request_tool(dialog)) | ||
} | ||
]; | ||
dialog.add_tool(get_join_channel_tool(dialog)); | ||
@@ -118,0 +168,0 @@ |
@@ -6,6 +6,5 @@ { | ||
"name": "@dialogai/telegram-client-dialog", | ||
"version": "1.0.5", | ||
"version": "1.0.6", | ||
"description": "Dialog module for working with telegram chats", | ||
"main": "index.js", | ||
"devDependencies": {}, | ||
"scripts": { | ||
@@ -12,0 +11,0 @@ "test": "echo \"Error: no test specified\" && exit 1" |
12446
172