File size: 2,848 Bytes
0d8ae5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import os
import fal_client
import asyncio

# Ключ берем из переменных окружения
FAL_KEY = os.environ.get("FAL_KEY")
fal_client.api_key = FAL_KEY


def clean_url(url):
    """

    Очистка URL от лишних параметров.

    Для ВК-фото оставляем как есть, для остальных (включая Supabase)

    отсекаем query-параметры, если они мешают загрузке в API.

    """
    if not url:
        return url
    if "userapi.com" in url:
        return url
    # Для прямых ссылок из бакета Supabase часто требуется чистый путь
    return url.split('?')[0]


async def generate_image(prompt, gender, photo_url=None, lora_model=None):
    """

    Основная функция генерации (Face Swap через Nano Banana).

    lora_model игнорируется, так как функционал отключен.

    """
    # Используем актуальный эндпоинт Nano Banana 2 для редактирования и Face Swap
    endpoint = "fal-ai/nano-banana/edit"

    # Очищаем промпт от плейсхолдера, если он попал из старой логики
    final_prompt = prompt.replace("{trigger}", "a person")

    try:
        # --- ВАРИАНТ Б: Face Swap (Nano Banana) ---
        # Оставляем только этот функционал с текущими настройками
        print(f"🚀 Генерация через Face Swap. Промпт: {final_prompt[:50]}...")

        # Подготавливаем URL (будь то ссылка из ВК или из вашего бакета)
        user_photo = clean_url(photo_url)

        arguments = {
            "image_urls": [user_photo],
            "prompt": final_prompt,
            "negative_prompt": "deformed face, blurry, low quality, bad anatomy, extra fingers, distorted features",
            "guidance_scale": 7.5,
            "image_size": "portrait_16_9",
            "num_inference_steps": 30,
            "strength": 0.55  # Оптимальная настройка для сохранения сходства и наложения стиля
        }

        # Вызов API Nano Banana 2
        result = await fal_client.subscribe_async(endpoint, arguments=arguments)

        if result and 'images' in result and len(result['images']) > 0:
            return result['images'][0]['url']
        else:
            print("⚠️ API вернуло пустой результат")
            return None

    except Exception as e:
        print(f"❌ Ошибка в генераторе (Endpoint: {endpoint}): {e}")
        return None