igor04091968 commited on
Commit
9cf97c7
·
verified ·
1 Parent(s): 18afb03

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +41 -24
app.py CHANGED
@@ -4,6 +4,7 @@ import os
4
  import fastapi
5
  import uvicorn
6
 
 
7
  # Системный промпт для настройки поведения модели
8
  SYSTEM_PROMPT = """
9
  You are a world-class expert in Linux system administration.
@@ -18,37 +19,56 @@ User: list all running docker containers
18
  You: docker ps
19
  """
20
 
21
- # Используем модель Meta Llama 3 70B - одна из лучших на данный момент
22
  MODEL = "meta-llama/Meta-Llama-3-70B-Instruct"
23
 
24
- def generate_command(user_request, hf_token):
 
 
 
 
 
25
  """
26
- Обращается к Hugging Face Inference API для генерации команды.
 
27
  """
 
 
 
 
 
 
 
 
 
 
28
  if not user_request:
29
  return "Ошибка: Запрос не может быть пустым."
30
- if not hf_token:
31
- return "Ошибка: Hugging Face Token не может быть пустым. Его можно получить в настройках вашего профиля Hugging Face."
32
 
33
  try:
34
- client = InferenceClient(model=MODEL, token=hf_token)
35
-
36
- # Формируем сообщения для модели
37
  messages = [
38
  {"role": "system", "content": SYSTEM_PROMPT},
39
  {"role": "user", "content": user_request},
40
  ]
41
-
42
- # Выполняем запрос к API
43
  response = client.chat_completion(
44
  messages=messages,
45
  max_tokens=200,
46
- temperature=0.1, # Низкая температура для более предсказуемых и точных команд
47
  )
48
-
49
  command = response.choices[0].message.content.strip()
 
 
 
 
 
 
 
50
 
51
- # Дополнительная очистка, чтобы убрать возможные артефакты
52
  if command.startswith("`") and command.endswith("`"):
53
  command = command[1:-1]
54
  if command.startswith("bash\n"):
@@ -57,10 +77,11 @@ def generate_command(user_request, hf_token):
57
  return command
58
 
59
  except Exception as e:
60
- # Возвращаем более детальную ошибку для отладки
61
  return f"Произошла ошибка API: {str(e)}"
62
 
63
- # Создаем интерфейс Gradio
 
64
  with gr.Blocks() as demo:
65
  gr.Markdown(
66
  """
@@ -72,9 +93,9 @@ with gr.Blocks() as demo:
72
 
73
  hf_token_input = gr.Textbox(
74
  label="Hugging Face User Access Token",
75
- placeholder="Введите ваш токен HF (начинается с hf_...)",
76
  type="password",
77
- info="Нужен для доступа к API. Можно создать в Settings -> Access Tokens вашего профиля."
78
  )
79
 
80
  user_input = gr.Textbox(label="Ваш запрос", placeholder="Например: 'покажи все файлы в текущей папке, отсортированные по размеру'", lines=3)
@@ -96,19 +117,15 @@ with gr.Blocks() as demo:
96
  """
97
  )
98
 
99
- # Создаем FastAPI приложение
 
100
  app = fastapi.FastAPI()
101
 
102
- # Добавляем эндпоинт для health check от Hugging Face
103
  @app.get("/health")
104
  def health_check():
105
  return {"status": "ok"}
106
 
107
- # Монтируем Gradio приложение в FastAPI.
108
- # Hugging Face будет запускать этот объект 'app'.
109
  app = gr.mount_gradio_app(app, demo, path="/")
110
 
111
- # Этот блок теперь будет использовать uvicorn для локального запуска,
112
- # что более точно имитирует среду выполнения Hugging Face.
113
  if __name__ == "__main__":
114
- uvicorn.run(app, host="0.0.0.0", port=7860)
 
4
  import fastapi
5
  import uvicorn
6
 
7
+ # --- Конфигурация ---
8
  # Системный промпт для настройки поведения модели
9
  SYSTEM_PROMPT = """
10
  You are a world-class expert in Linux system administration.
 
19
  You: docker ps
20
  """
21
 
22
+ # Модель для генерации команд
23
  MODEL = "meta-llama/Meta-Llama-3-70B-Instruct"
24
 
25
+ # Путь к файлу для долгосрочного хранения токена в постоянном хранилище Hugging Face
26
+ TOKEN_FILE_PATH = "/data/hf_token.txt"
27
+
28
+
29
+ # --- Логика приложения ---
30
+ def generate_command(user_request, hf_token_from_input):
31
  """
32
+ Генерирует команду, используя токен из поля ввода или из сохраненного файла.
33
+ При успешном использовании нового токена, сохраняет его.
34
  """
35
+ saved_token = None
36
+ # Пробуем прочитать сохраненный токен
37
+ if os.path.exists(TOKEN_FILE_PATH):
38
+ with open(TOKEN_FILE_PATH, "r") as f:
39
+ saved_token = f.read().strip()
40
+
41
+ # Приоритет отдается токену, введенному в поле. Если поле пустое, используется сохраненный.
42
+ token_to_use = hf_token_from_input if hf_token_from_input else saved_token
43
+
44
+ # Проверки
45
  if not user_request:
46
  return "Ошибка: Запрос не может быть пустым."
47
+ if not token_to_use:
48
+ return "Ошибка: Токен не найден. Введите его в поле выше и он сохранится для будущих сессий."
49
 
50
  try:
51
+ # Выполняем запрос к API
52
+ client = InferenceClient(model=MODEL, token=token_to_use)
 
53
  messages = [
54
  {"role": "system", "content": SYSTEM_PROMPT},
55
  {"role": "user", "content": user_request},
56
  ]
 
 
57
  response = client.chat_completion(
58
  messages=messages,
59
  max_tokens=200,
60
+ temperature=0.1,
61
  )
 
62
  command = response.choices[0].message.content.strip()
63
+
64
+ # --- Успешное выполнение ---
65
+ # Если был введен НОВЫЙ и ВАЛИДНЫЙ токен, сохраняем его в постоянное хранилище
66
+ if hf_token_from_input and hf_token_from_input == token_to_use:
67
+ os.makedirs(os.path.dirname(TOKEN_FILE_PATH), exist_ok=True)
68
+ with open(TOKEN_FILE_PATH, "w") as f:
69
+ f.write(hf_token_from_input)
70
 
71
+ # Очистка вывода от артефактов
72
  if command.startswith("`") and command.endswith("`"):
73
  command = command[1:-1]
74
  if command.startswith("bash\n"):
 
77
  return command
78
 
79
  except Exception as e:
80
+ # При ошибке пользователь увидит сообщение и сможет ввести новый (правильный) токен
81
  return f"Произошла ошибка API: {str(e)}"
82
 
83
+
84
+ # --- Интерфейс Gradio ---
85
  with gr.Blocks() as demo:
86
  gr.Markdown(
87
  """
 
93
 
94
  hf_token_input = gr.Textbox(
95
  label="Hugging Face User Access Token",
96
+ placeholder="Оставьте пустым для использования сохраненного токена",
97
  type="password",
98
+ info="Если ввести здесь новый токен, он сохранится для будущих сессий после успешной генерации команды."
99
  )
100
 
101
  user_input = gr.Textbox(label="Ваш запрос", placeholder="Например: 'покажи все файлы в текущей папке, отсортированные по размеру'", lines=3)
 
117
  """
118
  )
119
 
120
+
121
+ # --- Запуск приложения ---
122
  app = fastapi.FastAPI()
123
 
 
124
  @app.get("/health")
125
  def health_check():
126
  return {"status": "ok"}
127
 
 
 
128
  app = gr.mount_gradio_app(app, demo, path="/")
129
 
 
 
130
  if __name__ == "__main__":
131
+ uvicorn.run(app, host="0.0.0.0", port=7860)