import logging import asyncio import aiohttp from bot.config import OLLAMA_URL, OLLAMA_MODEL, PROMPT_FILE logger = logging.getLogger('ollama') def load_prompt() -> str: """Загрузка промпта из файла""" try: with open(PROMPT_FILE, 'r', encoding='utf-8') as f: return f.read().strip() except Exception as e: logger.error(f"Ошибка при загрузке промпта: {e}") return "Напиши комментарий к следующему посту:\n\n{text}" PROMPT_TEMPLATE = load_prompt() async def generate_comment(text: str, max_retries: int = 3) -> str | None: """Генерация комментария с помощью Ollama""" prompt = PROMPT_TEMPLATE.format(text=text) for attempt in range(max_retries): try: async with aiohttp.ClientSession() as session: async with session.post( f"{OLLAMA_URL}/api/generate", json={ "model": OLLAMA_MODEL, "prompt": prompt, "stream": False }, timeout=aiohttp.ClientTimeout(total=60) ) as response: response.raise_for_status() data = await response.json() comment = data.get('response', '') # Очистка от тегов comment = comment.replace('', '').replace('', '').strip() logger.info(f"Комментарий сгенерирован (попытка {attempt + 1})") return comment except aiohttp.ClientError as e: logger.warning(f"Ошибка подключения к Ollama (попытка {attempt + 1}): {e}") if attempt < max_retries - 1: await asyncio.sleep(2 ** attempt) # Exponential backoff else: logger.error(f"Не удалось подключиться к Ollama после {max_retries} попыток") except Exception as e: logger.error(f"Ошибка при генерации комментария: {e}") return None return None