diff --git a/handlers/voice.py b/handlers/voice.py
index 8895f07..f99216f 100644
--- a/handlers/voice.py
+++ b/handlers/voice.py
@@ -240,39 +240,41 @@ async def transcribe_audio(audio_path: str) -> str:
clean_path = tmp_wav
models_to_try = [
- 'gemini-2.5-flash',
- 'gemini-flash-latest',
- 'gemini-2.5-flash-lite',
- 'gemini-3.5-transcribe'
+ 'gemini-3.5-flash',
+ 'gemini-3-flash-preview',
+ 'gemini-2.0-flash',
+ 'gemini-1.5-flash'
]
- for model_name in models_to_try:
+ def _sync_transcribe(clean_file_path: str, m_name: str) -> str:
+ audio_file = genai.upload_file(path=clean_file_path)
try:
- logger.info(f"π [Gemini STT] Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ {clean_path} ΡΠ΅ΡΠ΅Π· {model_name}...")
- audio_file = genai.upload_file(path=clean_path)
-
prompt = (
"Π’ΠΎΡΠ½ΠΎ ΡΡΠ°Π½ΡΠΊΡΠΈΠ±ΠΈΡΡΠΉ ΡΡΡ Π°ΡΠ΄ΠΈΠΎΠ·Π°ΠΏΠΈΡΡ Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅ Π² ΡΠ΅ΠΊΡΡ. "
"ΠΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠΉ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π²Π²ΠΎΠ΄Π½ΡΡ
ΡΠ»ΠΎΠ², ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠΉ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π², ΠΎΡΠ΄Π°ΠΉ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΈΡΡΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠΈΠ·Π½Π΅ΡΠ΅Π½Π½ΡΡ
ΡΠ»ΠΎΠ²."
)
-
- model = genai.GenerativeModel(model_name)
- response = model.generate_content([audio_file, prompt])
-
+ model = genai.GenerativeModel(m_name)
+ resp = model.generate_content([audio_file, prompt])
+ return resp.text.strip() if resp and resp.text else ""
+ finally:
try:
genai.delete_file(name=audio_file.name)
except Exception:
pass
- if response and response.text and response.text.strip():
- text = response.text.strip()
+ for model_name in models_to_try:
+ try:
+ logger.info(f"π [Gemini STT] Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ {clean_path} ΡΠ΅ΡΠ΅Π· {model_name}...")
+ text = await asyncio.to_thread(_sync_transcribe, clean_path, model_name)
+
+ if text:
logger.info(f"π― [Gemini STT] Π£ΡΠΏΠ΅ΡΠ½ΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½ΠΎ ({model_name}): {text[:70]}...")
if tmp_wav and os.path.exists(tmp_wav):
os.remove(tmp_wav)
return text
except Exception as e:
logger.warning(f"β οΈ [Gemini STT] ΠΡΠΈΠ±ΠΊΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ {model_name}: {e}")
- await asyncio.sleep(1)
+ await asyncio.sleep(0.5)
if tmp_wav and os.path.exists(tmp_wav):
os.remove(tmp_wav)
@@ -306,25 +308,34 @@ async def execute_antigravity_agent(user_text: str) -> str:
"ΠΠ½ΡΡΡΠΈ Π½Π΅Π³ΠΎ Π½Π°ΠΏΠΈΡΠΈ ΠΊΠΎΡΠΎΡΠΊΡΡ (1-3 ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ), Π΅ΠΌΠΊΡΡ, ΡΠ΅ΠΏΠ»ΡΡ Π³ΠΎΠ»ΠΎΡΠΎΠ²ΡΡ Π²ΡΠΆΠΈΠΌΠΊΡ ΠΎΡ ΠΠ°ΠΉΠΈ Π±Π΅Π· Markdown ΠΈ ΡΠΌΠΎΠ΄Π·ΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ·Π²ΡΡΠ΅Π½Π° Π³ΠΎΠ»ΠΎΡΠΎΠΌ Π¨Π°Π΄Π΅."
)
- models_to_try = ['gemini-2.5-flash', 'gemini-flash-latest', 'gemini-2.5-flash-lite', 'gemini-3.7-flash', 'gemini-2.5-pro']
+ models_to_try = [
+ 'gemini-3.5-flash',
+ 'gemini-3-flash-preview',
+ 'gemini-2.0-flash',
+ 'gemini-1.5-flash'
+ ]
last_error = None
+ def _sync_run_agent(m_name: str, u_text: str) -> str:
+ model = genai.GenerativeModel(
+ model_name=m_name,
+ system_instruction=system_instruction,
+ tools=[query_bitrix24, execute_bash_command, save_to_obsidian]
+ )
+ chat = model.start_chat(enable_automatic_function_calling=True)
+ resp = chat.send_message(u_text)
+ return resp.text.strip() if resp and resp.text else ""
+
for model_name in models_to_try:
try:
logger.info(f"π [Maya Agent] ΠΠ°ΠΏΡΡΠΊ Ρ ΠΌΠΎΠ΄Π΅Π»ΡΡ: {model_name}")
- model = genai.GenerativeModel(
- model_name=model_name,
- system_instruction=system_instruction,
- tools=[query_bitrix24, execute_bash_command, save_to_obsidian]
- )
- chat = model.start_chat(enable_automatic_function_calling=True)
- response = chat.send_message(user_text)
- if response and response.text:
- return response.text.strip()
+ response_text = await asyncio.to_thread(_sync_run_agent, model_name, user_text)
+ if response_text:
+ return response_text
except Exception as e:
logger.warning(f"β οΈ [Maya Agent] Π‘Π±ΠΎΠΉ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ {model_name}: {e}")
last_error = e
- await asyncio.sleep(1)
+ await asyncio.sleep(0.5)
return f"β ΠΡΠΈΠ±ΠΊΠ° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Maya Agent: {last_error}"
@@ -370,6 +381,18 @@ async def handle_voice_message(message: Message, bot: Bot):
else:
return
+ target_obj = message.voice or message.video_note or message.audio or message.document
+ file_size = getattr(target_obj, "file_size", 0) or 0
+ if file_size > 20 * 1024 * 1024:
+ size_mb = round(file_size / (1024 * 1024), 1)
+ await message.reply(
+ f"β οΈ Π€Π°ΠΉΠ» ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠΉ ({size_mb} ΠΠ).\n\n"
+ "Telegram Bot API ΠΆΠ΅ΡΡΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΡΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π΄ΠΎ 20 ΠΠ.\n"
+ "π‘ Π Π΅ΡΠ΅Π½ΠΈΠ΅: Π‘ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠΉ Π·Π°ΠΏΠΈΡΡ Π΄ΠΈΠΊΡΠΎΡΠΎΠ½Π° Π² AAC/M4A/MP3 Ρ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΌ Π±ΠΈΡΡΠ΅ΠΉΡΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 64 kbps mono) ΠΈΠ»ΠΈ Π½Π°Π΄ΠΈΠΊΡΡΠΉ Π³ΠΎΠ»ΠΎΡΠΎΠ²ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΡΡΠΌΠΎ Π² ΡΠ°Ρ!",
+ parse_mode="HTML"
+ )
+ return
+
status_msg = await message.reply("π Π‘Π»ΡΡΠ°Ρ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ...", parse_mode="HTML")
await bot.send_chat_action(message.chat.id, "typing")