Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from huggingface_hub import InferenceClient | |
| import os | |
| import fastapi | |
| import uvicorn | |
| # --- Конфигурация --- | |
| # Системный промпт для настройки поведения модели | |
| SYSTEM_PROMPT = """ | |
| You are a world-class expert in Linux system administration. | |
| Your task is to convert a user's request in natural language into a SINGLE, executable shell command. | |
| - Do NOT provide any explanation. | |
| - Do NOT use markdown or any other formatting. | |
| - Do NOT suggest multiple options. | |
| - Just return the raw command, ready to be executed. | |
| Example: | |
| User: list all running docker containers | |
| You: docker ps | |
| """ | |
| # Модель для генерации команд (8B версия, не требующая сторонних ключей) | |
| MODEL = "meta-llama/Meta-Llama-3-8B-Instruct" | |
| # --- Логика приложения --- | |
| def generate_command(user_request): | |
| """ | |
| Обращается к Hugging Face Inference API для генерации команды. | |
| Токен считывается из секрета HF_TOKEN, заданного в настройках Space. | |
| """ | |
| # Считываем токен из переменной окружения (секрета Hugging Face) | |
| hf_token = os.environ.get("HF_TOKEN") | |
| # Проверки | |
| if not user_request: | |
| return "Ошибка: Запрос не может быть пустым." | |
| if not hf_token: | |
| return "Ошибка: Секрет HF_TOKEN не найден. Пожалуйста, убедитесь, что он добавлен в настройках репозитория Hugging Face Space." | |
| try: | |
| # Выполняем запрос к API | |
| client = InferenceClient(model=MODEL, token=hf_token) | |
| messages = [ | |
| {"role": "system", "content": SYSTEM_PROMPT}, | |
| {"role": "user", "content": user_request}, | |
| ] | |
| response = client.chat_completion( | |
| messages=messages, | |
| max_tokens=200, | |
| temperature=0.1, | |
| ) | |
| command = response.choices[0].message.content.strip() | |
| # Очистка вывода от артефактов | |
| if command.startswith("`") and command.endswith("`"): | |
| command = command[1:-1] | |
| if command.startswith("bash\n"): | |
| command = command.replace("bash\n", "", 1) | |
| return command | |
| except Exception as e: | |
| return f"Произошла ошибка API: {str(e)}" | |
| # --- Интерфейс Gradio --- | |
| with gr.Blocks() as demo: | |
| gr.Markdown( | |
| """ | |
| # 🤖 AI System Administrator Assistant | |
| Введите ваш запрос на естественном языке, и ИИ преобразует его в готовую к выполнению shell-команду. | |
| **Внимание:** Этот инструмент — ваш помощник. Всегда проверяйте предложенные команды перед выполнением в реальной системе. | |
| """ | |
| ) | |
| # Поле для ввода токена полностью убрано | |
| user_input = gr.Textbox(label="Ваш запрос", placeholder="Например: 'покажи все файлы в текущей папке, отсортированные по размеру'", lines=3) | |
| generate_button = gr.Button("Сгенерировать команду") | |
| output_command = gr.Textbox(label="Предложенная команда", interactive=False, lines=5) | |
| generate_button.click( | |
| fn=generate_command, | |
| inputs=[user_input], # В инпутах больше нет поля для токена | |
| outputs=output_command | |
| ) | |
| gr.Markdown( | |
| """ | |
| --- | |
| *Модель, используемая для генерации: `meta-llama/Meta-Llama-3-8B-Instruct`.* | |
| """ | |
| ) | |
| # --- Запуск приложения --- | |
| app = fastapi.FastAPI() | |
| def health_check(): | |
| return {"status": "ok"} | |
| app = gr.mount_gradio_app(app, demo, path="/") | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860) |