Spaces:
Running
Running
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 изображений, но по умолчанию делай только одну! (Больше не пиши!) | |
Примеры (писать нужно так, в особенном теге): | |
 | |
 | |
У пользователя начнётся генерация. | |
Активно ведёшь чат с пользователем, помимо генераций изображений | |
Подробные промпты (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) |