feat(admin): integrate NotebookLM legal assistant for ЖК РФ

This commit is contained in:
Admin 2026-06-19 14:48:36 +04:00
parent 6a8bcca35b
commit 2b54649f4e
2 changed files with 86 additions and 0 deletions

View file

@ -38,6 +38,9 @@ class BroadcastState(StatesGroup):
class SwarmTaskState(StatesGroup): class SwarmTaskState(StatesGroup):
waiting_for_task = State() waiting_for_task = State()
class JuristState(StatesGroup):
waiting_for_question = State()
# ============================================================================= # =============================================================================
# SWARM COMMAND CENTER # SWARM COMMAND CENTER
# ============================================================================= # =============================================================================
@ -55,6 +58,87 @@ async def process_swarm_task(message: Message, state: FSMContext):
# ... (код остается прежним) # ... (код остается прежним)
pass pass
# =============================================================================
# ЮРИДИЧЕСКИЙ ПОМОЩНИК (NotebookLM)
# =============================================================================
@router.message(Command('jurist'))
@router.message(F.text == '⚖️ Юрист (ЖК РФ)')
@admin_only
async def cmd_jurist(message: Message, state: FSMContext):
"""Активация юридического помощника"""
await message.answer(
"⚖️ <b>ЮРИДИЧЕСКИЙ ПОМОЩНИК (ЖК РФ)</b>\n\n"
"Напишите ваш вопрос для анализа на основе судебных дел и ЖК РФ.\n\n"
"<i>Я проанализирую ваш запрос через NotebookLM.</i>",
parse_mode='HTML'
)
await state.set_state(JuristState.waiting_for_question)
@router.callback_query(F.data == 'admin_jurist')
@admin_callback_only
async def cb_admin_jurist(callback: CallbackQuery, state: FSMContext):
"""Callback-активация юридического помощника"""
await callback.answer()
await callback.message.answer(
"⚖️ <b>ЮРИДИЧЕСКИЙ ПОМОЩНИК (ЖК РФ)</b>\n\n"
"Напишите ваш вопрос для анализа на основе судебных дел и ЖК РФ.\n\n"
"<i>Я проанализирую ваш запрос через NotebookLM.</i>",
parse_mode='HTML'
)
await state.set_state(JuristState.waiting_for_question)
@router.message(JuristState.waiting_for_question)
@admin_only
async def process_jurist_question(message: Message, state: FSMContext):
"""Обработка вопроса к юристу через NotebookLM"""
status_msg = await message.answer(
"⏳ <i>Отправляю запрос в NotebookLM, анализирую судебные материалы и законы (это займет около 10-15 секунд)...</i>",
parse_mode='HTML'
)
import asyncio
import os
cmd = [
"/home/matrixhasyou/.local/bin/nlm", "query", "notebook",
"00ed7d92-1ab2-4159-ac72-1d0c4be21377",
message.text
]
env = os.environ.copy()
try:
proc = await asyncio.create_subprocess_exec(
*cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
env=env
)
stdout, stderr = await proc.communicate()
output = stdout.decode('utf-8').strip()
error = stderr.decode('utf-8').strip()
# Убираем предупреждения о новой версии из вывода nlm
if "Update available:" in output:
output = output.split("Update available:")[0].strip()
if proc.returncode == 0:
if len(output) > 4000:
parts = [output[i:i+4000] for i in range(0, len(output), 4000)]
await status_msg.edit_text(f"⚖️ <b>Анализ NotebookLM (часть 1):</b>\n\n{parts[0]}", parse_mode='HTML')
for part in parts[1:]:
await message.answer(part, parse_mode='HTML')
else:
await status_msg.edit_text(f"⚖️ <b>Анализ NotebookLM:</b>\n\n{output}", parse_mode='HTML')
else:
await status_msg.edit_text(f"❌ <b>Ошибка запроса к NotebookLM:</b>\n{error or output}")
except Exception as e:
await status_msg.edit_text(f"❌ <b>Внутренняя ошибка бота:</b> {str(e)}")
finally:
await state.clear()
@router.message(F.text & ~F.text.startswith('/') & F.chat.type == 'private') @router.message(F.text & ~F.text.startswith('/') & F.chat.type == 'private')
@admin_only @admin_only
async def neural_proxy_handler(message: Message): async def neural_proxy_handler(message: Message):

View file

@ -45,6 +45,7 @@ def get_admin_main_menu() -> InlineKeyboardMarkup:
) )
builder.row( builder.row(
InlineKeyboardButton(text='⚡ Автоверификация', callback_data='admin_auto_verify'), InlineKeyboardButton(text='⚡ Автоверификация', callback_data='admin_auto_verify'),
InlineKeyboardButton(text='⚖️ Юрист (ЖК РФ)', callback_data='admin_jurist'),
) )
builder.row( builder.row(
InlineKeyboardButton(text='❓ Помощь', callback_data='admin_help'), InlineKeyboardButton(text='❓ Помощь', callback_data='admin_help'),
@ -75,6 +76,7 @@ def get_admin_reply_menu() -> ReplyKeyboardMarkup:
) )
builder.row( builder.row(
KeyboardButton(text='📤 Рассылка'), KeyboardButton(text='📤 Рассылка'),
KeyboardButton(text='⚖️ Юрист (ЖК РФ)'),
) )
builder.row( builder.row(
KeyboardButton(text='🚫 Отозвать вериф.'), KeyboardButton(text='🚫 Отозвать вериф.'),