File size: 4,215 Bytes
b30b7a6
 
 
6d48a2b
 
b30b7a6
9cf97c7
b30b7a6
 
 
 
 
 
 
 
 
 
 
 
 
 
82250dd
827a174
b30b7a6
9cf97c7
 
82250dd
b30b7a6
82250dd
 
b30b7a6
82250dd
 
9cf97c7
 
b30b7a6
 
82250dd
 
b30b7a6
 
9cf97c7
82250dd
b30b7a6
 
 
 
 
 
 
9cf97c7
b30b7a6
 
 
9cf97c7
b30b7a6
 
 
 
 
 
 
 
 
 
9cf97c7
 
b30b7a6
 
 
 
 
 
 
 
 
82250dd
f5a179e
b30b7a6
 
 
f5a179e
b30b7a6
 
 
82250dd
b30b7a6
 
 
 
 
 
82250dd
b30b7a6
 
 
9cf97c7
 
6d48a2b
 
2a5caa0
6d48a2b
 
 
 
 
b30b7a6
82250dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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)