File size: 2,848 Bytes
7cf04b0
 
 
 
158636b
7cf04b0
 
 
 
158636b
808c2e5
 
 
 
 
158636b
 
 
 
808c2e5
158636b
7cf04b0
 
158636b
7cf04b0
158636b
 
7cf04b0
808c2e5
158636b
7cf04b0
158636b
 
7cf04b0
158636b
 
 
 
ca14d9c
808c2e5
 
158636b
 
808c2e5
158636b
808c2e5
158636b
 
 
808c2e5
158636b
 
808c2e5
158636b
ca14d9c
 
 
 
808c2e5
ca14d9c
7cf04b0
 
158636b
7cf04b0
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