55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
import aiohttp
|
||
import logging
|
||
from config import OPENROUTER_API_KEY, OPENROUTER_MODEL
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
FORBIDDEN_WORDS = [
|
||
"мат", "блять", "сука", "хуй", "пизда", "ебать",
|
||
"fuck", "shit", "bitch", "asshole",
|
||
]
|
||
|
||
def is_safe_text(text: str) -> bool:
|
||
text_lower = text.lower()
|
||
for word in FORBIDDEN_WORDS:
|
||
if word in text_lower:
|
||
logger.warning(f"Обнаружено запрещённое слово: {word}")
|
||
return False
|
||
return True
|
||
|
||
async def ask_llm(messages: list) -> str:
|
||
url = "https://openrouter.ai/api/v1/chat/completions"
|
||
headers = {
|
||
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
|
||
"Content-Type": "application/json",
|
||
"HTTP-Referer": "https://github.com/bytik-bot",
|
||
"X-Title": "Bytik Bot",
|
||
}
|
||
payload = {
|
||
"model": OPENROUTER_MODEL,
|
||
"messages": messages,
|
||
"max_tokens": 500,
|
||
"temperature": 0.7,
|
||
}
|
||
|
||
try:
|
||
async with aiohttp.ClientSession() as session:
|
||
async with session.post(url, json=payload, headers=headers) as resp:
|
||
if resp.status != 200:
|
||
error_text = await resp.text()
|
||
logger.error(f"OpenRouter error: {resp.status} - {error_text}")
|
||
return "Ой, я что-то запутался. Попробуй спросить ещё раз! 🤔"
|
||
|
||
data = await resp.json()
|
||
answer = data["choices"][0]["message"]["content"].strip()
|
||
|
||
if not is_safe_text(answer):
|
||
logger.warning("Ответ от LLM содержит запрещённые слова. Блокируем.")
|
||
return "Извини, я не могу это обсудить. Давай поговорим о чём-то другом! 😊"
|
||
|
||
return answer
|
||
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при запросе к LLM: {e}")
|
||
return "Извини, я пока не могу ответить. Попробуй позже! 🤖"
|