← Назад к портфолио

PROJECT 02

Sudden Picture —
AI-редактор фото

Telegram-бот на Google Gemini 2.5 Flash Image (через OpenRouter). Редактирует одно фото по текстовой инструкции в подписи — или совмещает два фото из альбома в одну сцену.

Python Google Gemini 2.5 Flash OpenRouter python-telegram-bot aiohttp Photo Merge
// демо редактирования
🖼️ Sudden Picture Bot — выбери инструкцию и обработай изображение
ИСХОДНОЕ ФОТО
исходное фото
до 4MB после сжатия
РЕЗУЛЬТАТ
обработка через Gemini
результат
✓ готово
Выбери инструкцию и нажми «Обработать»
// как работает
bot/handlers.py — одиночное фото vs альбом
async def handle_photo_with_caption(self, update, context):
    # Часть альбома (media_group_id) → собираем оба фото и ждём 2с
    if update.message.media_group_id:
        await self._collect_media_group(update, context, update.message.media_group_id)
    else:
        await self._handle_single_photo(update, context)

# Совмещение: первое фото = сцена, второе = объект для вставки
edited_path = await self.image_editor.edit_image(
    image_bytes_list[0],
    caption,                                  # инструкция из подписи
    additional_images=image_bytes_list[1:]
)
openai_client/gemini_image_editor.py — вызов OpenRouter
async def _try_edit_with_model(self, image_bytes, edit_prompt, model, additional_images=None):
    content = [{"type": "image_url", "image_url": {"url": base64_image}}]

    # Второе фото (для режима совмещения) добавляется тем же способом
    for img in additional_images or []:
        content.append({"type": "image_url", "image_url": {"url": encode(img)}})
    content.append({"type": "text", "text": enhanced_prompt})

    async with session.post(f"{self.base_url}/chat/completions", json={
        "model": model,   # google/gemini-2.5-flash-image через OpenRouter
        "messages": [{"role": "user", "content": content}],
    }) as response:
        result = await response.json()
    return self._extract_image_from_response(result)
// детали реализации

ТЕХНИЧЕСКИ

  • Google Gemini 2.5 Flash Image через OpenRouter (multimodal chat API)
  • Альбом собирается по media_group_id с задержкой 2с через job_queue
  • ImageUtils сжимает фото до 4MB перед отправкой в API
  • Retry с паузой 15с при rate limit (до 3 попыток)
  • Разные системные промпты для точечной правки и для «драматичных» изменений

ИСПОЛЬЗОВАНИЕ

  • Одно фото + подпись-инструкция → отредактированное фото
  • Альбом из 2 фото + подпись к первому → совмещённая сцена
  • Первое фото альбома = фон, второе = объект для вставки
  • Обработка занимает 10–40 секунд в зависимости от режима
  • /help — примеры инструкций для обоих режимов