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) |