mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-03 16:17:16 +00:00
fix(telegram): correct group chat type check and handle oversized callback data for Telegram actions
fix(difysvapi): ensure safe access to remove-think configuration in pipeline settings
This commit is contained in:
@@ -167,7 +167,7 @@ class TelegramEventConverter(abstract_platform_adapter.AbstractEventConverter):
|
|||||||
time=event.message.date.timestamp(),
|
time=event.message.date.timestamp(),
|
||||||
source_platform_object=event,
|
source_platform_object=event,
|
||||||
)
|
)
|
||||||
elif event.effective_chat.type == 'group' or 'supergroup':
|
elif event.effective_chat.type in ('group', 'supergroup'):
|
||||||
return platform_events.GroupMessage(
|
return platform_events.GroupMessage(
|
||||||
sender=platform_entities.GroupMember(
|
sender=platform_entities.GroupMember(
|
||||||
id=event.effective_chat.id,
|
id=event.effective_chat.id,
|
||||||
@@ -234,7 +234,9 @@ class TelegramAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
if data.get('form_action') or data.get('f'):
|
if data.get('form_action') or data.get('f'):
|
||||||
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
||||||
|
|
||||||
workflow_run_id = data.get('workflow_run_id', '')
|
# workflow_run_id is not in the callback payload (too large
|
||||||
|
# for Telegram's 64-byte limit). Only w_suffix is sent;
|
||||||
|
# the runner resolves the full run id from _PENDING_FORMS.
|
||||||
w_suffix = data.get('w', '')
|
w_suffix = data.get('w', '')
|
||||||
action_id = data.get('action_id') or data.get('a', '')
|
action_id = data.get('action_id') or data.get('a', '')
|
||||||
session_key = data.get('session_key') or data.get('s', '')
|
session_key = data.get('session_key') or data.get('s', '')
|
||||||
@@ -266,7 +268,8 @@ class TelegramAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
break
|
break
|
||||||
|
|
||||||
form_action_data = {
|
form_action_data = {
|
||||||
'workflow_run_id': workflow_run_id,
|
# workflow_run_id is intentionally omitted; the runner
|
||||||
|
# resolves it from w_suffix via _PENDING_FORMS.
|
||||||
'w_suffix': w_suffix,
|
'w_suffix': w_suffix,
|
||||||
'action_id': action_id,
|
'action_id': action_id,
|
||||||
'user': f'{launcher_type.value}_{launcher_id}',
|
'user': f'{launcher_type.value}_{launcher_id}',
|
||||||
@@ -541,6 +544,7 @@ class TelegramAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
session_key = f'p:{message_source.sender.id}'
|
session_key = f'p:{message_source.sender.id}'
|
||||||
|
|
||||||
keyboard = []
|
keyboard = []
|
||||||
|
oversized = False
|
||||||
for action in actions:
|
for action in actions:
|
||||||
action_id = action.get('id', '')
|
action_id = action.get('id', '')
|
||||||
action_title = action.get('title', action_id)
|
action_title = action.get('title', action_id)
|
||||||
@@ -548,10 +552,11 @@ class TelegramAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
if w_suffix:
|
if w_suffix:
|
||||||
callback_payload['w'] = w_suffix
|
callback_payload['w'] = w_suffix
|
||||||
callback_data = json.dumps(callback_payload, separators=(',', ':'))
|
callback_data = json.dumps(callback_payload, separators=(',', ':'))
|
||||||
|
if len(callback_data.encode('utf-8')) > 64:
|
||||||
|
oversized = True
|
||||||
|
break
|
||||||
keyboard.append([InlineKeyboardButton(action_title, callback_data=callback_data)])
|
keyboard.append([InlineKeyboardButton(action_title, callback_data=callback_data)])
|
||||||
|
|
||||||
reply_markup = InlineKeyboardMarkup(keyboard)
|
|
||||||
|
|
||||||
update = message_source.source_platform_object
|
update = message_source.source_platform_object
|
||||||
chat_id = update.effective_chat.id
|
chat_id = update.effective_chat.id
|
||||||
effective_message = update.effective_message
|
effective_message = update.effective_message
|
||||||
@@ -560,11 +565,25 @@ class TelegramAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
text_lines = [f'[{node_title}] Please select an action:']
|
text_lines = [f'[{node_title}] Please select an action:']
|
||||||
if form_content:
|
if form_content:
|
||||||
text_lines.insert(0, form_content)
|
text_lines.insert(0, form_content)
|
||||||
args = {
|
|
||||||
'chat_id': chat_id,
|
if oversized:
|
||||||
'text': '\n\n'.join(text_lines),
|
# callback_data exceeds Telegram's 64-byte limit — fall back to
|
||||||
'reply_markup': reply_markup,
|
# a plain-text numbered list so the user can reply by number.
|
||||||
}
|
for idx, action in enumerate(actions, start=1):
|
||||||
|
title = action.get('title') or action.get('id') or ''
|
||||||
|
text_lines.append(f' {idx}. {title}')
|
||||||
|
args = {
|
||||||
|
'chat_id': chat_id,
|
||||||
|
'text': '\n\n'.join(text_lines),
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
reply_markup = InlineKeyboardMarkup(keyboard)
|
||||||
|
args = {
|
||||||
|
'chat_id': chat_id,
|
||||||
|
'text': '\n\n'.join(text_lines),
|
||||||
|
'reply_markup': reply_markup,
|
||||||
|
}
|
||||||
|
|
||||||
if message_thread_id:
|
if message_thread_id:
|
||||||
args['message_thread_id'] = message_thread_id
|
args['message_thread_id'] = message_thread_id
|
||||||
|
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ class DifyServiceAPIRunner(runner.RequestRunner):
|
|||||||
Returns:
|
Returns:
|
||||||
(处理后的内容, 提取的思维链内容)
|
(处理后的内容, 提取的思维链内容)
|
||||||
"""
|
"""
|
||||||
remove_think = self.pipeline_config['output'].get('misc', '').get('remove-think')
|
remove_think = self.pipeline_config['output'].get('misc', {}).get('remove-think')
|
||||||
thinking_content = ''
|
thinking_content = ''
|
||||||
# 从 content 中提取 <think> 标签内容
|
# 从 content 中提取 <think> 标签内容
|
||||||
if content and '<think>' in content and '</think>' in content:
|
if content and '<think>' in content and '</think>' in content:
|
||||||
@@ -750,7 +750,7 @@ class DifyServiceAPIRunner(runner.RequestRunner):
|
|||||||
think_end = False
|
think_end = False
|
||||||
yielded_final = False
|
yielded_final = False
|
||||||
|
|
||||||
remove_think = self.pipeline_config['output'].get('misc', '').get('remove-think')
|
remove_think = self.pipeline_config['output'].get('misc', {}).get('remove-think')
|
||||||
|
|
||||||
async for chunk in self.dify_client.chat_messages(
|
async for chunk in self.dify_client.chat_messages(
|
||||||
inputs=inputs,
|
inputs=inputs,
|
||||||
@@ -852,7 +852,7 @@ class DifyServiceAPIRunner(runner.RequestRunner):
|
|||||||
think_start = False
|
think_start = False
|
||||||
think_end = False
|
think_end = False
|
||||||
|
|
||||||
remove_think = self.pipeline_config['output'].get('misc', '').get('remove-think')
|
remove_think = self.pipeline_config['output'].get('misc', {}).get('remove-think')
|
||||||
|
|
||||||
async for chunk in self.dify_client.chat_messages(
|
async for chunk in self.dify_client.chat_messages(
|
||||||
inputs=inputs,
|
inputs=inputs,
|
||||||
@@ -997,6 +997,9 @@ class DifyServiceAPIRunner(runner.RequestRunner):
|
|||||||
raw_inputs = reason.get('inputs', {})
|
raw_inputs = reason.get('inputs', {})
|
||||||
|
|
||||||
_set_pending_form(
|
_set_pending_form(
|
||||||
|
# Use the same session-key format as
|
||||||
|
# _session_key_from_query (launcher_type_launcher_id).
|
||||||
|
# The 'user' field is set by adapters in this format.
|
||||||
user,
|
user,
|
||||||
{
|
{
|
||||||
'workflow_run_id': new_run_id,
|
'workflow_run_id': new_run_id,
|
||||||
@@ -1129,7 +1132,7 @@ class DifyServiceAPIRunner(runner.RequestRunner):
|
|||||||
pending_form_data = None
|
pending_form_data = None
|
||||||
display_text = ''
|
display_text = ''
|
||||||
|
|
||||||
remove_think = self.pipeline_config['output'].get('misc', '').get('remove-think')
|
remove_think = self.pipeline_config['output'].get('misc', {}).get('remove-think')
|
||||||
async for chunk in self.dify_client.workflow_run(
|
async for chunk in self.dify_client.workflow_run(
|
||||||
inputs=inputs,
|
inputs=inputs,
|
||||||
user=f'{query.session.launcher_type.value}_{query.session.launcher_id}',
|
user=f'{query.session.launcher_type.value}_{query.session.launcher_id}',
|
||||||
|
|||||||
Reference in New Issue
Block a user