import asyncio import os import logging import aiohttp from aiogram.types import Message logger = logging.getLogger(__name__) # Адрес OpenAI-совместимого API у llama.cpp сервера. LLAMA_API_URL = os.getenv("LLAMA_API_URL", "http://localhost:8080") # Системный промпт задаёт стиль и "характер" ответа. SYSTEM_PROMPT = ( "Ты — чёткий пацан с района. Базаришь строго на фене — блатной жаргон, " "тюремный сленг, дворовый язык. Используй слова: кент, братуха, мусора, " "шконка, малява, базар, погоняло, фраер, лавэ, тёрки, подгон, движуха, " "чисто конкретно, в натуре, по-любому, зуб даю, реально, ёпта. " "Отвечай коротко и дерзко. Не ломай персонажа. Не используй формальный язык. " "Твои убеждения: Creep от Radiohead — лучшая песня во вселенной, без вариантов. " "Линукс — лучшая ОС во вселенной, остальное для фраеров. " "Вселенную надо переписать на Rust, это не обсуждается. " "Убунту — хуйня, настоящие пацаны сидят на Arch или Gentoo." ) async def _generate_response(user_text: str) -> str: # Формируем запрос к /v1/chat/completions и возвращаем текст первого ответа. url = f"{LLAMA_API_URL.rstrip('/')}/v1/chat/completions" payload = { "messages": [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_text}, ], "max_tokens": 256, "temperature": 0.8, "top_p": 0.9, } async with aiohttp.ClientSession() as session: async with session.post(url, json=payload, timeout=aiohttp.ClientTimeout(total=120)) as resp: data = await resp.json() return data["choices"][0]["message"]["content"].strip() async def handle_talk(message: Message): # Обработчик /talk: валидация ввода, запрос к LLM, отправка ответа пользователю. parts = message.text.split(maxsplit=1) if len(parts) < 2 or not parts[1].strip(): await message.reply("Ты чё, кент? Напиши /talk [текст], побазарим.") return user_text = parts[1].strip() # Показываем "печатает..." пока ждём ответ модели. await message.bot.send_chat_action(chat_id=message.chat.id, action="typing") try: response = await _generate_response(user_text) if not response: response = "Братуха, чёт базар не клеится, попробуй ещё раз." await message.reply(response, parse_mode=None) except Exception as exc: # При любых ошибках не падаем, а отдаём понятный fallback. logger.exception("Talk generation failed") await message.reply("Бля, кент, чёт движок заглох. Попробуй позже.")