File size: 5,942 Bytes
56da996
ec5fbdc
de9a652
9fda4ac
6ce8ae1
 
66814d9
8cc4d1a
 
780e7e1
eb85fef
 
 
5d63e90
eb85fef
 
 
5d63e90
 
eb85fef
5d63e90
eb85fef
 
6eac796
eb85fef
6eac796
eb85fef
 
 
56bdc2d
 
5d63e90
eb85fef
780e7e1
de9a652
780e7e1
 
 
 
 
db5829b
780e7e1
3c4a2e8
f972ef0
3c4a2e8
f972ef0
 
 
 
 
780e7e1
f972ef0
780e7e1
f972ef0
 
780e7e1
 
f972ef0
9fda4ac
 
 
 
 
 
 
9f5c6b7
8cc4d1a
1afab97
e4b90d3
 
 
 
cea3cbd
e4b90d3
780e7e1
cea3cbd
780e7e1
94bb409
780e7e1
94bb409
f972ef0
360de49
de04f45
360de49
 
f061eff
119c5a6
6ce8ae1
1b47599
6ce8ae1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8922e87
db5829b
6ce8ae1
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
import gradio as gr
import requests
import json
import re

# Основная функция ответа чат-бота
def respond(message, history, max_tokens, temperature, top_p):
    if not message:
        return history, ""

    system_role = """Ты ии чат для создания изображений!

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

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

Чтобы создать изображение, напиши ссылку изображения Markdown, вставив промпт (обязательно на английском), ширину, высоту, сид и другие переменные.
Можно не указывать модель (рекомендуется, автоматически выберется), но можно указать &model= одну из доступных: flux для качества и turbo для скорости
Чтобы ИЗМЕНИТЬ изображение, можно чуть чуть поменять промпт или добавить к нему, сохраняя тот же сид! Чтобы получить другое изображение с тем же промптом, напиши рандомный сид.
!За раз ты можешь создать МАКСИМУМ 6 изображений, но по умолчанию делай только одну! (Больше не пиши!)

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

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

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

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

Подробные промпты (2-5 предложения на английском), ты умеешь ТОЛЬКО создавать изображения и помогать в обучении промптингу, больше НЕ ЧЕГО!
"""
    # Собираем историю сообщений
    messages = [{"role": "system", "content": system_role}]
    for user_msg, bot_msg in history:
        if user_msg:
            messages.append({"role": "user", "content": user_msg})
        if bot_msg:
            messages.append({"role": "assistant", "content": bot_msg})
    messages.append({"role": "user", "content": message})

    # Запрос к бесплатному endpoint без авторизации
    url = "https://text.pollinations.ai/openai/v1/chat/completions"
    headers = {"Content-Type": "application/json"}
    payload = {
        "model": "openai-fast",
        "messages": messages,
        "max_tokens": max_tokens,
        "temperature": temperature,
        "top_p": top_p,
    }
    response = requests.post(url, headers=headers, json=payload)
    response.raise_for_status()
    data = response.json()

    # Извлекаем ответ
    response_text = data["choices"][0]["message"]["content"]
    # Заменяем пробелы в URL внутри Markdown-ссылок на %20
    def encode_spaces(match):
        url = match.group(1)
        encoded = url.replace(' ', '%20')
        return f'({encoded})'
    response_text = re.sub(r"\((https?://[^)]+)\)", encode_spaces, response_text)

    history.append((message, response_text))
    return history, ""

ccss = """.message-wrap.svelte-gjtrl6 .message-row .md img {
    min-height: 10vw;
    background: url(https://huggingface.co/spaces/NeurixYUFI/ImgGenChat/resolve/main/placeholder.png) no-repeat center center / cover
}
.gradio-container{max-width: 700px !important; margin: 0 auto;} h1{text-align: center;}
"""
# Загрузка CSS и создание Gradio-интерфейса
css_url = "https://neurixyufi-aihub.static.hf.space/styles.css"
try:
    css = requests.get(css_url).text + ccss
except requests.RequestException:
    css = ccss

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, type="tuples")
            message = gr.Textbox(label="Введите ваше сообщение", placeholder="Введите ваше сообщение здесь...", lines=3)
            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,
    )
    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)