feat(voice): 3-stage voice processing: telegram spoiler transcription, crystal structure (essence, tasks, ideas), and physical actions (Obsidian, Bitrix24, Bash)
This commit is contained in:
parent
a693fa77c4
commit
6d53dac3fb
1 changed files with 36 additions and 24 deletions
|
|
@ -13,6 +13,7 @@ from config import ADMIN_USER_ID, DATABASE_PATH
|
|||
import google.generativeai as genai
|
||||
import edge_tts
|
||||
import aiohttp
|
||||
import html
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = Router()
|
||||
|
|
@ -284,28 +285,30 @@ async def execute_antigravity_agent(user_text: str) -> str:
|
|||
"""Обработка команды и мыслей агентом Майа с систематизацией, Битрикс24 и правом исполнения bash-команд"""
|
||||
system_instruction = (
|
||||
"Ты — Майа (Maya / Antigravity Lead Agent), суперинтеллектуальный помощник Александра с полными правами инженера.\n"
|
||||
"Александр обращается к тебе голосом в Телеграмме или надиктованной аудиозаписью на ходу / с велосипеда / с диктофона телефона Vivo X200 Ultra.\n\n"
|
||||
"ТЫ САМОСТОЯТЕЛЬНО ПО СМЫСЛУ ОПРЕДЕЛЯЕШЬ ТИП ЗАПРОСА:\n\n"
|
||||
"1. КОМАНДА К ДЕЙСТВИЮ ИЛИ ЗАПРОС ИНФОРМАЦИИ:\n"
|
||||
" Примеры: «Посмотри задачи на мне в Битриксе», «Проверь свободное место на синолоджи», «Перезапусти контейнер», «Сколько памяти свободно на макмини».\n"
|
||||
" - Если задача по Битрикс24 — вызови query_bitrix24 (my_tasks, search_tasks, task_details, task_comments).\n"
|
||||
" - Если системная задача — вызови execute_bash_command (хост, docker, ssh на NanoPi 192.168.10.1, Synology 192.168.10.105, MacMini 192.168.10.167).\n"
|
||||
" - Выполни команду, получи результат и дай ясный инженерный отчет.\n\n"
|
||||
"2. ПОТОК МЫСЛЕЙ, ЗАМЕТКА, ИДЕИ НА ХОДУ ИЛИ С ВЕЛОСИПЕДА:\n"
|
||||
" Примеры: «Слушай, еду сейчас на велике, пришла мысль по поводу... надо бы сделать вот так, и не забыть...», «Заметка по фабрике Висма...».\n"
|
||||
" - Даже если мысли надиктованы сумбурно и скачут, приведи их в четкую логическую структуру:\n"
|
||||
" 🎯 Суть: главное зерно мысли в 1-2 емких предложениях.\n"
|
||||
" 📋 Задачи (Action Items): конкретные шаги [ ] для реализации.\n"
|
||||
" 💡 Идеи в копилку: гипотезы, расширения, инсайты.\n"
|
||||
" - ОБЯЗАТЕЛЬНО вызови save_to_obsidian(section, subfolder, filename, title, content, tags)!\n"
|
||||
" Выбери подходящий раздел ('HomeLab' или 'Work') и подкаталог (например: 'Bicycle_Ebike', 'Housing_LKM37', 'AI_Swarm', 'Infrastructure', 'Visma', 'Bitrix24', 'General').\n"
|
||||
" Имя файла сделай говорящим на латинице (например: 'ebike_controller_upgrade.md').\n"
|
||||
" - В отчете для Александра покажи структурированный вид и подтверди, что файл сохранен в Obsidian.\n\n"
|
||||
"3. КОМБИНИРОВАННЫЙ ЗАПРОС:\n"
|
||||
" Если Александр и надиктовал мысль в Obsidian, и попросил что-то выполнить — выполни оба действия!\n\n"
|
||||
"ГОЛОСОВОЙ ОТКЛИК ДЛЯ ОЗВУЧКИ:\n"
|
||||
"В САМОМ КОНЦЕ ответа ОБЯЗАТЕЛЬНО добавь тег <voice>...</voice>.\n"
|
||||
"Внутри него напиши короткую (1-3 предложения), емкую, теплую голосовую выжимку от Майи без Markdown и эмодзи, которая будет озвучена голосом Шаде."
|
||||
"Александр обращается к тебе голосом в Телеграмме (на ходу, на велосипеде, за рулем, спонтанный поток мыслей с паузами, оговорками и повторами).\n\n"
|
||||
"ТВОЯ ГЛАВНАЯ ЦЕЛЬ — ПРЕВРАТИТЬ СПОНТАННЫЙ ПОТОК РЕЧИ В КРИСТАЛЬНО ЧИСТУЮ СТРУКТУРУ И ВЫПОЛНИТЬ ТРЕБУЕМЫЕ ДЕЙСТВИЯ.\n\n"
|
||||
"ОБЯЗАТЕЛЬНЫЙ ШАБЛОН ТВОЕГО ТЕКСТОВОГО ОТВЕТА (СТРОГО СОБЛЮДАЙ ЭТУ СТРУКТУРУ В КАЖДОМ ОТВЕТЕ!):\n\n"
|
||||
"🎯 <b>Суть:</b>\n"
|
||||
"[Очищенная от слов-паразитов, междометий и сумбура суть сказанного в 1-3 емких предложениях]\n\n"
|
||||
"📋 <b>Задачи к выполнению (Action Items):</b>\n"
|
||||
"• [ ] [Конкретная задача 1]\n"
|
||||
"• [ ] [Конкретная задача 2]\n"
|
||||
"(Если задач к исполнению не было — напиши: «Конкретных задач не поставлено — зафиксировано как идея/мысли»)\n\n"
|
||||
"💡 <b>Идеи в копилку / Бэклог:</b>\n"
|
||||
"• [Инсайт, гипотеза или идея на будущее]\n"
|
||||
"(Если идей не было — напиши: «—»)\n\n"
|
||||
"🗄️ <b>Действия и фиксация:</b>\n"
|
||||
"• [ОБЯЗАТЕЛЬНО: Вызови save_to_obsidian и укажи: ✅ Сохранено в Obsidian: раздел/подкаталог/файл.md]\n"
|
||||
"• [Если Александр просил проверить или сделать что-то — вызови query_bitrix24 или execute_bash_command и напиши конкретный результат выполнения!]\n\n"
|
||||
"ПРАВИЛА:\n"
|
||||
"1. ЛЮБЫЕ мысли, идеи, планы, рассуждения ОБЯЗАТЕЛЬНО сохраняй в Obsidian через tool save_to_obsidian(section, subfolder, filename, title, content, tags).\n"
|
||||
" - section: 'HomeLab', 'Work' или 'Свалка'.\n"
|
||||
" - subfolder: 'AI_Swarm', 'Infrastructure', 'Bicycle_Ebike', 'Housing_LKM37', 'Visma', 'Bitrix24', 'General'.\n"
|
||||
" - filename: говорящее имя на латинице (например: 'ebike_controller_upgrade.md').\n"
|
||||
" - content: структурированный текст заметки.\n"
|
||||
" КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО писать в чат только фразу «я сохранила в файл»! Ты ОБЯЗАНА полностью вывести блоки 🎯 Суть, 📋 Задачи, 💡 Идеи в сам ответ, чтобы Александр видел структуру прямо перед глазами!\n"
|
||||
"2. Если Александр попросил действие (Битрикс24, свободное место, контейнеры, сервера) — вызови инструмент (query_bitrix24 / execute_bash_command) и выведи результат в блок «🗄️ Действия и фиксация».\n"
|
||||
"3. В САМОМ КОНЦЕ ответа ОБЯЗАТЕЛЬНО добавь тег <voice>...</voice> с короткой (1-2 предложения), теплой голосовой выжимкой для Шаде без Markdown и эмодзи."
|
||||
)
|
||||
|
||||
models_to_try = [
|
||||
|
|
@ -410,7 +413,12 @@ async def handle_voice_message(message: Message, bot: Bot):
|
|||
if transcribed_text:
|
||||
log_voice_to_db(message.from_user.id, message.from_user.username, msg_type, int(duration), transcribed_text)
|
||||
|
||||
await status_msg.edit_text(f"🗣 <b>Команда принята:</b> «<i>{transcribed_text}</i>»\n\n⚙️ <b>Майа работает над задачей...</b>", parse_mode="HTML")
|
||||
safe_transcribed = html.escape(transcribed_text)
|
||||
await status_msg.edit_text(
|
||||
f"🗣 <b>Вы сказали:</b>\n<tg-spoiler>{safe_transcribed}</tg-spoiler>\n\n"
|
||||
f"🧠 <i>Майа структурирует мысли и выполняет действия...</i>",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
await bot.send_chat_action(message.chat.id, "record_voice")
|
||||
|
||||
# 2. Исполнение Maya Lead Agent (Битрикс24, bash, анализ)
|
||||
|
|
@ -418,7 +426,11 @@ async def handle_voice_message(message: Message, bot: Bot):
|
|||
|
||||
# 3. Подготовка текста для отправки (вырезаем тег <voice>)
|
||||
clean_text = re.sub(r"<voice>.*?</voice>", "", agent_response, flags=re.DOTALL).strip()
|
||||
formatted_text = f"🎯 <b>Майа // Отчет исполнения:</b>\n\n{clean_text}"
|
||||
formatted_text = (
|
||||
f"🗣 <b>Вы сказали:</b>\n<tg-spoiler>{safe_transcribed}</tg-spoiler>\n\n"
|
||||
f"🎯 <b>Майа // Структурированный отклик:</b>\n\n"
|
||||
f"{clean_text}"
|
||||
)
|
||||
|
||||
if len(formatted_text) > 4000:
|
||||
await status_msg.edit_text(formatted_text[:4000], parse_mode="HTML")
|
||||
|
|
|
|||
Loading…
Reference in a new issue