Spaces:
Running
Running
| import gradio as gr | |
| from huggingface_hub import InferenceClient | |
| from typing import List, Tuple | |
| # Список 10 моделей (добавь свои) | |
| MODELS = [ | |
| "microsoft/Phi-3-mini-4k-instruct", | |
| "Qwen/Qwen2.5-0.5B-Instruct", | |
| "Qwen/Qwen2.5-1.5B-Instruct", | |
| "google/gemma-2-2b-it", | |
| "HuggingFaceH4/zephyr-7b-beta", | |
| "mistralai/Mistral-7B-Instruct-v0.3", | |
| "unsloth/Mistral-Nemo-Instruct-2407-12B-GGUF", | |
| "microsoft/Phi-3.5-mini-instruct", | |
| "NousResearch/Hermes-2-Theta-Llama-3.1-8B", | |
| "cognitivecomputations/dolphin-2.9-llama3-8b" | |
| ] | |
| def convert_history(history: List[Tuple[str, str]]) -> List[dict]: | |
| """Конвертирует Gradio history [[user_msg, bot_msg]] в OpenAI messages.""" | |
| messages = [] | |
| for user_msg, bot_msg in history: | |
| messages.append({"role": "user", "content": user_msg}) | |
| if bot_msg: # Если ответ есть | |
| messages.append({"role": "assistant", "content": bot_msg}) | |
| return messages | |
| def chat_response(message: str, history: List[Tuple[str, str]], model_id: str, system_prompt: str): | |
| """Главная функция: отправляет чат в HF Inference API.""" | |
| try: | |
| client = InferenceClient(model=model_id) | |
| # Строим messages | |
| messages = [] | |
| if system_prompt.strip(): # Если system не пустой | |
| messages.append({"role": "system", "content": system_prompt}) | |
| messages.extend(convert_history(history)) # История чата | |
| messages.append({"role": "user", "content": message}) # Текущее сообщение | |
| # Генерируем ответ (max_new_tokens=512 для скорости) | |
| response = client.chat_completion( | |
| messages=messages, | |
| max_tokens=512, # Лимит токенов ответа (токены ~ слова/4) | |
| temperature=0.7, # Креативность (0=детерминировано, 1=случайно) | |
| stream=False # Без стриминга для простоты | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| # Обработка ошибок (rate limit, модель не найдена) | |
| return f"Ошибка: {str(e)}. Проверь модель или подожди (API лимит)." | |
| # UI: ChatInterface с доп. полями | |
| with gr.Blocks(title="Тест Чат-Ботов HF") as demo: | |
| gr.Markdown("# Тестер ИИ-моделей HF\nВыбери модель, system prompt (опционально), чатай!") | |
| # Дополнительные inputs (выше чата) | |
| model_dropdown = gr.Dropdown( | |
| choices=MODELS, | |
| value=MODELS[0], # По умолчанию Phi-3 | |
| label="Модель HF (выбери или замени на свою)", | |
| interactive=True | |
| ) | |
| system_input = gr.Textbox( | |
| label="System Prompt (системное сообщение, опционально)", | |
| placeholder="Пример: Ты полезный ассистент. Отвечай кратко.", | |
| lines=2 | |
| ) | |
| # Чат | |
| chat = gr.ChatInterface( | |
| fn=chat_response, | |
| additional_inputs=[model_dropdown, system_input], | |
| title="Чат с моделью", | |
| description="Тестируй промпты, jailbreak, код. Смени модель — чат обновится.", | |
| examples=None, # Добавь свои примеры позже | |
| cache_examples=False, | |
| retry_btn="🔄 Повторить", | |
| undo_btn="↶ Назад", | |
| clear_btn="🗑️ Очистить" | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue(max_size=10).launch(share=True, debug=True) # share=True для публичной ссылки |