Files
fckbot/core/commands/expert.py
Markov Andrey 6b5113d448 Add new file
2026-06-30 09:04:26 +00:00

121 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
Экспертные команды: !summary, !metrics.
Не зависят от комнаты (используют последний загруженный пользователем файл или общую БЗ).
"""
import time
import logging
from core.commands.base import Command
from core.functions.summarize_document import summarize_document
from core.functions.extract_metrics import extract_metrics
logger = logging.getLogger(__name__)
class SummaryCommand(Command):
name = "!summary"
aliases = ["/summary", "!суммаризация", "/суммаризация"]
async def execute(self, msg, args: str, user_jid: str, room_jid: str = None):
# Используем текст последнего загруженного файла (личный или комнатный он хранится в last_file_texts)
last_text = self.bot.last_file_texts.get(user_jid, "")
if not last_text:
reply = msg.reply("Нет документа для суммаризации.")
if reply:
reply.send() # исправлено
else:
logger.error("Не удалось отправить сообщение об отсутствии документа для суммаризации")
return
reply = msg.reply("📝 Создаю суммаризацию...")
if reply:
reply.send() # исправлено
else:
logger.error("Не удалось отправить сообщение о начале суммаризации")
# Исправленный вызов: используем функцию из core.functions
summary = await summarize_document(
giga=self.bot.giga,
text=last_text,
title="Ваш документ",
prompt_text=self.bot.ai_prompts.get('summary', ''),
bot_config=self.bot.config
)
reply = msg.reply(f"📄 **Суммаризация:**\n\n{summary}")
if reply:
reply.send() # исправлено
else:
logger.error("Не удалось отправить суммаризацию")
def get_help(self) -> str:
return "Создаёт суммаризацию последнего загруженного документа."
class MetricsCommand(Command):
name = "!metrics"
aliases = ["/metrics", "!метрики", "/метрики"]
cache_ttl = 300 # 5 минут
async def execute(self, msg, args: str, user_jid: str, room_jid: str = None):
cache_key = self.get_cache_key(user_jid, args)
now = time.time()
if cache_key in self._cache:
cached_time, cached_result = self._cache[cache_key]
if now - cached_time < self.cache_ttl:
reply = msg.reply(cached_result)
if reply:
reply.send() # исправлено
else:
logger.error("Не удалось отправить кэшированный результат метрик")
return
reply = msg.reply("🔍 Ищу числовые показатели в ваших документах...")
if reply:
reply.send() # исправлено
else:
logger.error("Не удалось отправить сообщение о поиске метрик")
query = "числовые показатели KPI метрики статистика проценты суммы количество"
# Ищем по всей доступной БЗ (личной + глобальной или комнатной + глобальной)
context = await self.bot.kb.find_relevant_info(query, user_jid, room_jid, top_k=30)
if not context:
reply = msg.reply("📭 В вашей базе знаний нет документов с числовыми показателями.")
if reply:
reply.send() # исправлено
else:
logger.error("Не удалось отправить сообщение об отсутствии метрик")
return
# Исправленный вызов: используем функцию из core.functions
metrics = await extract_metrics(
giga=self.bot.giga,
context=context,
prompt_text=self.bot.ai_prompts.get('metrics', ''),
bot_config=self.bot.config
)
if metrics:
lines = []
for m in metrics[:20]:
name = m.get('metric_name', 'Показатель')
value = m.get('value', '?')
unit = m.get('unit', '')
period = m.get('period', '')
line = f"- **{name}**: {value}"
if unit:
line += f" {unit}"
if period:
line += f" ({period})"
lines.append(line)
reply = "📊 **Извлечённые метрики из ваших документов:**\n" + "\n".join(lines)
self._cache[cache_key] = (time.time(), reply)
reply_obj = msg.reply(reply)
if reply_obj:
reply_obj.send() # исправлено
else:
logger.error("Не удалось отправить список метрик")
else:
reply_obj = msg.reply("⚠️ Не удалось извлечь структурированные метрики.")
if reply_obj:
reply_obj.send() # исправлено
else:
logger.error("Не удалось отправить сообщение об ошибке извлечения метрик")
def get_help(self) -> str:
return "Извлекает KPI из базы знаний (с кэшем на 5 минут)."