igor04091968's picture
Upload app.py with huggingface_hub
82250dd verified
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()
@app.get("/health")
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)