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)