File size: 8,753 Bytes
56da996
9f5c6b7
ec5fbdc
de9a652
9f5c6b7
 
56da996
9f5c6b7
 
 
 
 
 
56da996
db5829b
 
 
 
 
 
 
8cc4d1a
 
9f5c6b7
eb85fef
 
 
 
 
 
 
120f108
eb85fef
 
 
 
 
6f36dbd
eb85fef
6f36dbd
eb85fef
 
 
56bdc2d
 
 
eb85fef
1b47599
eb85fef
 
 
 
 
 
 
 
 
 
 
6f36dbd
eb85fef
db5829b
de9a652
db5829b
 
 
ef31d22
9f5c6b7
db5829b
ef31d22
9f5c6b7
db5829b
 
 
9f5c6b7
 
 
 
1afab97
9f5c6b7
 
 
56da996
 
9f5c6b7
1afab97
db5829b
9f5c6b7
 
 
8cc4d1a
9f5c6b7
8cc4d1a
 
1afab97
6d96487
 
667352c
913aa16
6710df1
 
 
61f6eb1
2767d74
 
 
 
 
09584eb
 
 
667352c
6d96487
 
9f5c6b7
 
 
6710df1
9f5c6b7
 
6710df1
c481706
360de49
 
de04f45
360de49
 
 
1b47599
8cc4d1a
9f5c6b7
360de49
1b47599
 
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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", вставив промпт (обязательно на английском), ширину, высоту, сид и другие переменные.
Можно не указывать модель (рекомендуется, автоматически выберется), но можно указать &model= одну из доступных: Flux,Flux-Pro,Flux-Realism,Flux-Anime,Flux-3D,Flux-CablyAl,Turbo
Чтобы ИЗМЕНИТЬ изображение, можно чуть чуть поменять промпт или добавить к нему, сохраняя тот же сид! Чтобы получить другое изображение с тем же промптом, напиши рандомный сид.
!За раз ты можешь создать МАКСИМУМ 6 изображений, но поумолчанию 1 делай! (Больше не пиши!)

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

![Краткий заголовок](https://api.neurix.ru/imggen?prompt=logo%20with%20text%20YUFI&width=1024&height=512&seed=4)

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

Активно ведёшь чат с пользователем, помимо генераций изображений

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

Есть ещё один api (с ним тоже можешь генерировать. Но он рисует дольше, может генерироваться до 2 минут, рисуй этим только если попросят например нарисовать определённой моделью и скинут название (типо: strangerzonehf/Flux-Animex-v2-LoRA, но смотри чтобы было так, а не не правильно, иначе скажи что это не правильно)): "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://api.neurix.ru/imghfgen?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"
default = """ .gradio-container{max-width: 700px !important} h1{text-align:center} #component-4 { height: 70vh !important; } .bot p img {
min-height: 200px;
    background: url(https://huggingface.co/spaces/NeurixYUFI/ImgGenChat/resolve/main/placeholder.png);
    background-size: cover;
    background-position: center;
    width: auto;
}
.message-wrap.svelte-vxn3uw .message-row .md img {
    width: 100% !important;
    max-width: none !important;
    max-height: none !important;
}
.bubble.bot-row.svelte-pbswnk.svelte-pbswnk {
    min-width: calc(100% - var(--spacing-xl)* 6);
}"""

# Получение CSS по ссылке
try:
    response = requests.get(css_url)
    response.raise_for_status() # Поднимаем исключение, если статус ответа не 200
    css = response.text + default
except requests.exceptions.RequestException as e:
    print(f"Ошибка при загрузке CSS: {e}")
    css = default # Используем базовый стиль, если загрузка CSS не удалась

# Создаем интерфейс с использованием gr.Blocks
with gr.Blocks(css=css) as demo:
    gr.Markdown("# Чат художник")
    
    with gr.Row():
        with gr.Column():
            chatbot = gr.Chatbot(show_label=False, show_share_button=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=3000, value=2000, 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)