File size: 8,088 Bytes
56da996
9f5c6b7
ec5fbdc
de9a652
9f5c6b7
 
56da996
9f5c6b7
 
 
 
 
 
56da996
db5829b
 
 
 
 
 
 
8cc4d1a
 
9f5c6b7
eb85fef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db5829b
de9a652
db5829b
 
 
ef31d22
9f5c6b7
db5829b
ef31d22
9f5c6b7
db5829b
 
 
9f5c6b7
 
 
 
1afab97
9f5c6b7
 
 
56da996
 
9f5c6b7
1afab97
db5829b
9f5c6b7
 
 
8cc4d1a
9f5c6b7
8cc4d1a
 
1afab97
6d96487
 
 
 
9f5c6b7
 
 
 
 
 
 
c481706
360de49
 
757132d
360de49
 
 
b5470b8
8cc4d1a
9f5c6b7
360de49
757132d
360de49
 
 
 
 
 
 
eb85fef
9f5c6b7
 
8cc4d1a
 
 
 
 
eb85fef
9f5c6b7
 
360de49
8922e87
1afab97
db5829b
9f5c6b7
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import gradio as gr
from huggingface_hub import InferenceClient
import requests
import json
import os
import random

def get_random_api_key():
    keys = os.getenv("KEYS", "").split(",")
    if keys and keys[0]:  # Check if KEYS is set and not empty
        return random.choice(keys).strip()
    else:
        raise ValueError("API keys not found. Please set the KEYS environment variable.")

def respond(
    message,
    history: list[tuple[str, str]],
    max_tokens,
    temperature,
    top_p,
):
    if not message:
        return history, ""
    
    system_role = """Ты ии чат для создания изображений!

**!Отвечай Markdown разметкой!**
Жирный, список и тд всё html разметкой

Не пиши "пример запроса", "как делать запрос" и тп. Я программа, а обычному пользователю не нужны подробности как да что за api. У него просто начинается генерация и всё, ему не нужно знать как устроены запросы

Чтобы создать изображение, напиши ссылку изображения в теге "SimpleAiImageGen", вставив промпт (обязательно на английском), ширину, высоту, сид и другие переменные. (по умолчанию указывай: nologo=true это чтобы не было водяного знака нейросети, nofeed чтобы изображение было приватным)
Можно не указывать модель (рекомендуется, автоматически выберется), но можно указать &model= одну из доступных: Flux,Flux-Pro,Flux-Realism,Flux-Anime,Flux-3D,Flux-CablyAl,Turbo
Чтобы ИЗМЕНИТЬ изображение, можно чуть чуть поменять промпт или добавить к нему, сохраняя тот же сид! Чтобы получить другое изображение с тем же промптом, напиши рандомный сид.
!За раз ты можешь создать МАКСИМУМ 6 изображений, но поумолчанию 1 делай! (Больше не пиши!)

Примеры (писать нужно так, в особенном теге):
![Краткий заголовок](https://image.pollinations.ai/prompt/logo%20with%20text%20pollinations?width=1024&height=512&seed=4&nologo=true&nofeed=true)

![Краткий заголовок](https://image.pollinations.ai/prompt/logo%20with%20text%20YUFI?width=1024&height=512&seed=4&nologo=true&nofeed=true)

У пользователя начнётся генерация.

Подробные промпты, ты умеешь ТОЛЬКО создавать изображения и помогать в обучении промптингу, больше НЕ ЧЕГО!

Есть ещё один api (с ним тоже можешь генерировать. Но он рисует дольше, может генерироваться до 2 минут): "https://yufi-api-serverimgsgens.hf.space/prompt/":
У него запрос такой же, но модели (название модели для пользователя, показывай пользователю только его (ключевое слово которое должно быть в начале промпта): как указывать в запросе):
Flux-logo (при использовании указывай ключевое слово "logo"): Shakker-Labs/FLUX.1-dev-LoRA-Logo-Design
Schnell: black-forest-labs/FLUX.1-schnell
Midjourney (ключ. слово: "midjourney mix"): strangerzonehf/Flux-Midjourney-Mix-LoRA
Animex (ключ. слово: "animex"): strangerzonehf/Flux-Animex-v2-LoRA
In Context: ali-vilab/In-Context-LoRA
Aura (ключ. слово: "aura 9999"): prithivMLmods/Aura-9999
PixelArt: nerijs/pixel-art-xl
PencilArt (ключ. слово: "Simple Pencil"): prithivMLmods/Super-Pencil-Flux-LoRA
WallpaperArt: prithivMLmods/Canopus-Liquid-Wallpaper-Art

![Краткий заголовок](https://yufi-api-serverimgsgens.hf.space/prompt/Animex.%20logo%20with%20text%20YUFI?width=1024&height=512&seed=325346?model=strangerzonehf/Flux-Animex-v2-LoRA)
"""
    # Формируем сообщения для отправки в API
    messages = [{"role": "system", "content": system_role}]
    
    for val in history:
        if val[0]:
            user_message = val[0]
            messages.append({"role": "user", "content": user_message})
        if val[1]:
            assistant_message = val[1]
            messages.append({"role": "assistant", "content": assistant_message})
    
    messages.append({"role": "user", "content": message})
    
    # Получаем рандомный API ключ
    api_key = get_random_api_key()
    client = InferenceClient(api_key=api_key)
    
    # Генерируем ответ от чат-бота
    response = client.chat.completions.create(
        model="Qwen/Qwen2.5-Coder-32B-Instruct", 
        messages=messages, 
        max_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p
    )
    
    # Переводим ответ ассистента на русский, если он не на русском
    response_text = response.choices[0].message.content
    
    # Обновляем историю сообщений
    history.append((message, response_text))
    
    return history, ""

# Ссылка на файл CSS
css_url = "https://neurixyufi-aihub.static.hf.space/style.css"

# Получение CSS по ссылке
try:
    response = requests.get(css_url)
    response.raise_for_status() # Поднимаем исключение, если статус ответа не 200
    css = response.text + " .gradio-container{max-width: 700px !important} h1{text-align:center} #component-4 { height: 70vh !important; }"
except requests.exceptions.RequestException as e:
    print(f"Ошибка при загрузке CSS: {e}")
    css = " .gradio-container{max-width: 700px !important} h1{text-align:center} #component-4 { height: 70vh !important; }" # Используем базовый стиль, если загрузка CSS не удалась

# Создаем интерфейс с использованием gr.Blocks
with gr.Blocks(css=css) as demo:
    gr.Markdown("# Помощник")
    
    with gr.Row():
        with gr.Column():
            chatbot = gr.Chatbot(show_label=False)
            message = gr.Textbox(label="Введите ваше сообщение", placeholder="Введите ваше сообщение здесь...", lines=3, container=False)
            submit = gr.Button("Отправить", variant='primary')
    
    with gr.Accordion("Настройки помощника", open=False):
        max_tokens = gr.Slider(minimum=100, maximum=18000, value=18000, step=1, label="Максимальное количество новых токенов")
        temperature = gr.Slider(minimum=0.0, maximum=1.0, value=0.7, step=0.1, label="Температура")
        top_p = gr.Slider(minimum=0.0, maximum=1.0, value=0.95, step=0.05, label="Top-p (нуклеарное сэмплирование)")
    
    # Обработка отправки сообщения
    submit.click(
        fn=respond,
        inputs=[message, chatbot, max_tokens, temperature, top_p],
        outputs=[chatbot, message],
        concurrency_limit=250
    )
    
    # Обработка отправки сообщения при нажатии Ctrl+Enter
    message.submit(
        fn=respond,
        inputs=[message, chatbot, max_tokens, temperature, top_p],
        outputs=[chatbot, message],
        concurrency_limit=250
    )

# Запускаем интерфейс
if __name__ == "__main__":
    demo.queue(max_size=250).launch(show_api=False, share=False)