ImgGenChat / app.py
Rooni's picture
Update app.py
cea3cbd verified
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)